用戶希望矩形面積/長方體體積計算結果「精確」。Java `double` 為 IEEE 754 雙精度浮點數,**二進制無法精確表示大多數十進制小數** (如 `0.1`),會產生 `2.3 * 3 = 6.8999999999999995` 這類誤差。
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| BigDecimal 全程計算 | 金融、科學計算、需精確小數位 | 任意精度、可控舍入模式 | 性能差、代碼冗長、需處理 `scale` |
| double 計算 + 輸出格式化 | 幾何、圖形、一般工程計算 | 性能高、代碼簡潔、硬件加速 | 極值/疊加誤差不可避免 |
| 定點數 (長整型存毫微單位) | 嵌入式、高性能定點運算 | 整數運算、零誤差 | 溢出風險、單位換算繁瑣 |
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..."
**不建議**。字段保持 `double`,計算用 `double`,只有**進入持久化層 (DB `DECIMAL`)、序列化 (JSON)、UI 顯示**時轉 `BigDecimal`/`DecimalFormat`。避免業務邏輯到處充斥 `BigDecimal` 導致可讀性下降。