首頁  >  文章  >  Java  >  如何避免 Java 中的浮點精度錯誤:浮點型、雙精度型和 BigDecimal

如何避免 Java 中的浮點精度錯誤:浮點型、雙精度型和 BigDecimal

Susan Sarandon
Susan Sarandon原創
2024-11-18 04:43:02766瀏覽

How to Avoid Floating Point Precision Errors in Java: Floats, Doubles, and BigDecimal

避免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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn