案發現場
運行結果出乎意料,並不是想要的1990;
事件跟蹤
19.9 作爲 Double 類型表示,二進制形式是:
1 00000000110 011111001100110011001100110011001100110011001100110
(注意中間的兩個空格,如果你不知道啥意思,就去查查double的內存表示形式吧)
但是19.9 * 100 由於是二進制運算的結果是
1 00000010011 111000101111111111111111111111111111111111111111111
由於後面有n個11111所以我猜測可能發生了溢出被計算機捨去了.
於是這個數字比 1990少那麼一點點(可能是 1989.99999999…)
但是你的取整操作卻直接截斷了後面的數字,於是成了1989
案件偵破
次偵破過程出現些許差錯,BigDecimal()值得重視,String類型和double類型回執參數不通;入參爲String類型(涉足參需謹慎);
代碼運行截圖
代碼塊
public static void main(String[] args) throws Exception {
double d = 19.9;
// 入參爲String類型
BigDecimal bignum1 = new BigDecimal(String.valueOf(d));
BigDecimal bignum2 = new BigDecimal("100");
BigDecimal bignum3 = bignum1.multiply(bignum2); //乘法運算
// 入參爲double類型
BigDecimal bignum4 = new BigDecimal(d);
BigDecimal bignum5 = new BigDecimal("100");
BigDecimal bignum6 = bignum4.multiply(bignum5); //乘法運算
System.out.println(bignum6.intValue());
System.out.println(bignum3.intValue());
}
案件偵破協助
https://blog.csdn.net/qingdaohaoyunpeng/article/details/50738995