使用BigDecimal丟失精度的問題


使用BigDecimal丟失精度的問題

通常使用double時會需要運算,但是往往出現精度丟失的問題:

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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM