在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float來計算?在日常使用中double、float的浮點計算經常會出現一些意外的情況,因為二進制不能精確的表示大部分十進制的小數,今天就來討論一下如何正確的在Java中進行小數計算。
先看案例
我們定義兩個 float 變量,一個是1.0-0.9,我們預期是0.1;另一個是0.9-0.8,我們預期也是0.1,然後我們對這兩個數進行打印和比較:
運行結果是:
是不是超出了你的預期?在二進制的世界裡小數不能很好的被表示,因為十進制小數在與二進制轉換的時候會運行除法,而除法有的是除不盡的,這就造成了精度損失。
使用BigDecimal解決
java中提供了BigDecimal這個超大的類,用來存儲浮點型,使用它可以處理二進制誤差問題。我們使用BigDecimal改造上面的運算邏輯:
運行結果是:
使用BigDecimal的注意點
由於精度損失問題,使用new BigDecimal()的時候,我們只能使用參數為String的構造函數,也可以使用 BigDecimal.valueOf() 的方式,因為BigDecimal.valueOf()裡面調用了Double.toString()方法,根據double實際表達能力對尾數進行了截斷,我們可以查看一下JDK裡面的源代碼:
閱讀更多 任霏 的文章