2017-09-25 91 views
2

我期待這樣的代碼:的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代替。

這是錯誤嗎?或者我錯過了什麼?

+0

[BigDecimal的不可預測性(double)構造]的可能的複製(https://stackoverflow.com/questions/12218515/unpredictability-of-the-bigdecimaldouble-constructor) – Goibniu

+0

BigDecimal爲四捨五入正確。您正在使用doubleValue(),這會導致不正確。 –

回答

5

一切都正確。
您可以在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

希望它可以幫助