浮點型商業運算中丟失精度問題

計算機用二進制存儲數據,用有限位去近似表示一個浮點數會產生精度問題。爲了能精確的表示、計算浮點數,Java提供了BigDecimal類。
注意,在創建 BigDecimal 對象時,一定要使用String對象作爲構造器參數,而不是直接使用double 數字。原因:

public BigDecimal(double val);

此構造方法的結果有一定的不可預知性。有人可能認爲在 Java 中寫入 new BigDecimal(0.1) 所創建的 BigDecimal 正好等於 0.1(非標度值 1,其標度爲 1),但是它實際上等於 0.1000000000000000055511151231257827021181583404541015625。這是因爲 0.1 無法準確地表示爲 double (或者說對於該情況,不能表示爲任何有限長度的二進制小數)。這樣, 傳入到構造方法的值不會正好等於 0.1(雖然表面上等於該值)。另一方面, String 構造方法是完全可預知的:寫入 new BigDecimal(“0.1”) 將創建一個 BigDecimal ,它正好等於預期的 0.1。因此,比較而言,通常建議優先使用 String 構造方法 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章