我期待這樣的代碼:的BigDecimal舍入錯誤
double valore = 20.775;
BigDecimal c = new BigDecimal(valore);
c = c.setScale(2, RoundingMode.HALF_UP);
System.out.println(c.doubleValue());
返回20.78,但它返回20.77代替。
這是錯誤嗎?或者我錯過了什麼?
我期待這樣的代碼:的BigDecimal舍入錯誤
double valore = 20.775;
BigDecimal c = new BigDecimal(valore);
c = c.setScale(2, RoundingMode.HALF_UP);
System.out.println(c.doubleValue());
返回20.78,但它返回20.77代替。
這是錯誤嗎?或者我錯過了什麼?
一切都正確。
您可以在another answer on SO讀一些高層次的細節或讀取更多的documentation to BigDecimal
這是不常見的使用BigDecimal
構造與double
PARAM,因爲它會完全代表裏面是什麼double
。 所以,當你寫:new BigDecimal(20.775)
你不一定有20.775結果(而你將不得不像20.77499999999999857891452847979962825775146484375
)
爲您測試:
1)測試的BigDecimal表示
一)System.out.println(new BigDecimal(20.775));
=>20.77499999999999857891452847979962825775146484375
b)System.out.println(new BigDecimal("20.775"));
=>20.775
2)測試具有不同BigDecimal
構造四捨五入:
一個)new BigDecimal(20.775)
四捨五入後將顯示20.77。
b)new BigDecimal("20.775")
四捨五入後會顯示20.78。
c)new BigDecimal(String.valueOf(20.775)
四捨五入後會顯示20.78。
所以作爲結論: 請勿使用BigDecimal
構造函數與double
param。 改爲使用BigDecimal
構造函數,參數String
。
希望它可以幫助
[BigDecimal的不可預測性(double)構造]的可能的複製(https://stackoverflow.com/questions/12218515/unpredictability-of-the-bigdecimaldouble-constructor) – Goibniu
BigDecimal爲四捨五入正確。您正在使用doubleValue(),這會導致不正確。 –