2015-06-04 166 views
4

在Java中,我注意到1.1+(2.2*(3.3+4.4))結果爲18.040000000000003,而不是18.04。有沒有辦法來防止這種情況發生?Java中的雙精度浮點型

+3

使用'BigDecimal'類。 – brso05

+2

爲什麼這不完全出來,請參閱[爲什麼不使用Double或Float來表示貨幣?](http://stackoverflow.com/q/3730019/217324) –

回答

3

這是使用浮點運算的結果,你有兩個選擇:

  1. Math.round該操作的結果,但我想這不是你想要的。
  2. 使用java.math.BigDecimal(任意精度小數),允許您存儲那些小數點而不會損失精度。
+1

工作得很好:)顯然,我可以' t接受,所以這即將到來(預計在1小時左右!) – HyperNeutrino

+0

這是一個精度問題,而不是一個舍入問題 – ControlAltDel

+0

它不是定點算術 - 它使用雙精度浮點。 –

1

如果您的目標需要精確計算並完全控制精度,那麼我會建議使用BigDecimal類。 BigDecimal允許用戶設置非常精確的規則,通過設置分割點後的數位數,舍入模式以及接受MathContext作爲參數來完成計算。

然而存在一些缺點。首先,BigDecimal是對象,因此所有的操作都是通過方法完成的,而不是使用標準的數學運算符。這有點麻煩,尤其是在構建更復雜的表達時,如果不仔細做,可能會導致一些令人討厭的不潔代碼。其次,正如所說的,所有的操作都是在物體上完成的,它們在資源方面更爲重要。