在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float來計算?在日常使用中double、float的浮點計算經常會出現一些意外的情況,因為二進制不能精確的表示大部分十進制的小數,今天就來討論一下如何正確的在Java中進行小數計算。

先看案例

我們定義兩個 float 變量,一個是1.0-0.9,我們預期是0.1;另一個是0.9-0.8,我們預期也是0.1,然後我們對這兩個數進行打印和比較:

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

運行結果是:

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

是不是超出了你的預期?在二進制的世界裡小數不能很好的被表示,因為十進制小數在與二進制轉換的時候會運行除法,而除法有的是除不盡的,這就造成了精度損失。

使用BigDecimal解決

java中提供了BigDecimal這個超大的類,用來存儲浮點型,使用它可以處理二進制誤差問題。我們使用BigDecimal改造上面的運算邏輯:


在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

運行結果是:

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float

使用BigDecimal的注意點

由於精度損失問題,使用new BigDecimal()的時候,我們只能使用參數為String的構造函數,也可以使用 BigDecimal.valueOf() 的方式,因為BigDecimal.valueOf()裡面調用了Double.toString()方法,根據double實際表達能力對尾數進行了截斷,我們可以查看一下JDK裡面的源代碼:

在Java中涉及到交易和金融貨幣的時候為什麼不能用double、float


分享到:


相關文章: