使用BigDecimal丟失精度的問題
double d1 = 0.01; double d2 = 0.1; System.out.println(d2 - d1); //輸出 0.09000000000000001
常識告訴我們使用BigDecimal能解決精度丟失的問題:
BigDecimal b1 = new BigDecimal(0.01); BigDecimal b2 = new BigDecimal(0.1); System.out.println(b2.subtract(b1)); //輸出 0.09000000000000000534294830600856585078872740268707275390625
還是丟失了精度,為什么呢?
在BigDecimal傳double參數的構造方法中,有這樣一句話“The results of this constructor can be somewhat unpredictable.”意思是這個構造函數的結果在某種程度上是不可預測的。所以初始化BigDecimal時傳入double的方式不可取。
如何不丟失精度?
1,使用Double.toString方法轉字符串
BigDecimal b1 = new BigDecimal(Double.toString(0.01)); BigDecimal b2 = new BigDecimal(Double.toString(0.1)); System.out.println(b2.subtract(b1)); //輸出 0.09
2、直接傳入一個字符串
BigDecimal b1 = new BigDecimal("0.01"); BigDecimal b2 = new BigDecimal("0.1"); System.out.println(b2.subtract(b1)); //輸出 0.09
3、使用BigDecimal.valueOf方法
BigDecimal b1 = BigDecimal.valueOf(0.01); BigDecimal b2 = BigDecimal.valueOf(0.1); System.out.println(b2.subtract(b1)); //輸出 0.09