避免Java 中浮點數和雙精度數的浮點精度錯誤
在Java 中處理大量浮點數或雙精度數時,累加浮點數精度誤差可能是一個問題。出現此錯誤的原因是浮點數或雙精度數無法精確表示某些數值,例如 0.1。
考慮以下程式碼:
for (float value = 0.0f; value < 1.0f; value += 0.1f) { System.out.println(value); }
預期輸出:
0.1 0.2 0.3 ... 0.9
實際輸出:
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.70000005 0.8000001 0.9000001
顯然,輸出由於浮點不準確而偏離預期值。要解決此問題,主要有兩種方法:
1。調整顯示精度和允許公差
使用雙精度類型時,將顯示限制為所需的位數,並引入較小的公差以進行相等性檢查。這允許表示 0.1 等數字,而不會出現明顯的捨入錯誤。
2。使用 BigDecimal 進行精確表示
或者,考慮使用 BigDecimal 而不是浮點數或雙精度數。 BigDecimal 提供了一種以任意精度表示數字的方法,消除了舍入誤差並允許精確表示 0.1 等值。
以下是使用BigDecimal 的範例:
BigDecimal step = new BigDecimal("0.1"); for (BigDecimal value = BigDecimal.ZERO; value.compareTo(BigDecimal.ONE) < 0; value = value.add(step)) { System.out.println(value); }
此程式碼將列印:
0.1 0.2 0.3 ... 0.9
透過選擇適當的方法,開發人員可以在使用浮點數或Java 中的雙倍。
以上是如何避免 Java 中的浮點精度錯誤:浮點型、雙精度型和 BigDecimal的詳細內容。更多資訊請關注PHP中文網其他相關文章!