首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java數值計算精度控制:BigDecimal應用於Setter還是輸出格式化?

     編輯:程式設計綜合問答

問題本質

用戶希望矩形面積/長方體體積計算結果「精確」。Java `double` 為 IEEE 754 雙精度浮點數,**二進制無法精確表示大多數十進制小數** (如 `0.1`),會產生 `2.3 * 3 = 6.8999999999999995` 這類誤差。

方案對比

方案適用場景優點缺點
BigDecimal 全程計算金融、科學計算、需精確小數位任意精度、可控舍入模式性能差、代碼冗長、需處理 `scale`
double 計算 + 輸出格式化幾何、圖形、一般工程計算性能高、代碼簡潔、硬件加速極值/疊加誤差不可避免
定點數 (長整型存毫微單位)嵌入式、高性能定點運算整數運算、零誤差溢出風險、單位換算繁瑣

推薦:幾何計算用 double + DecimalFormat 輸出


public class Rectangle {
    private double length, width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    public double findArea() {
        return length * width; // double 計算
    }

    // 格式化輸出:保留 2 位小數,四捨五入
    public String getAreaFormatted() {
        return new DecimalFormat("#.##").format(findArea());
    }
}

// 使用
Rectangle r = new Rectangle(2.3, 3);
System.out.println(r.getAreaFormatted()); // 輸出 "6.9" 而非 "6.8999..."

何時必須用 BigDecimal?

  • 涉及**金額、利率、匯率**等財務數據。
  • 需**精確比較** (如 `a == b`)、**精確累加** (如賬單求和)。
  • 規範要求**固定小數位且不可四捨五入誤差** (如稅務報表)。

Setter 中用 BigDecimal 存儲?

**不建議**。字段保持 `double`,計算用 `double`,只有**進入持久化層 (DB `DECIMAL`)、序列化 (JSON)、UI 顯示**時轉 `BigDecimal`/`DecimalFormat`。避免業務邏輯到處充斥 `BigDecimal` 導致可讀性下降。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved