浮點數轉整數時,Java 預設行為是「截斷」(向零取整),而非四捨五入。這個細節在金融計算、邊界判斷中極易產生 Bug。本文對比兩種方式並給出最佳實踐。
double d1 = 0.7, d2 = -0.7;
int i1 = (int) d1; // 0
int i2 = (int) d2; // 0(向零取整,非向下取整)
float f1 = 0.7f, f2 = -0.7f;
int j1 = (int) f1; // 0
int j2 = (int) f2; // 0
規則:丟棄小數部分,保留整數部分(正數向下、負數向上)。
Math.round(0.7) // 1 (long)
Math.round(0.4) // 0
Math.round(-0.7) // -1
Math.round(-0.4) // 0
Math.round(0.7f) // 1 (int)
Math.round(-0.7f) // -1
double 入參 → long;float 入參 → int。(long)Math.floor(x + 0.5),即「加 0.5 後向下取整」。java.lang,無需額外導入。金融/科學計算需指定捨入模式與精度:
BigDecimal bd = new BigDecimal("1.555");
bd.setScale(2, RoundingMode.HALF_UP) // 1.56
.setScale(2, RoundingMode.HALF_EVEN) // 1.56 (銀行家捨入)
.setScale(2, RoundingMode.DOWN); // 1.55 (截斷)
| 輸入 | (int) 強轉 | Math.round | Math.floor | Math.ceil |
|---|---|---|---|---|
| 2.3 | 2 | 2 | 2 | 3 |
| 2.7 | 2 | 3 | 2 | 3 |
| -2.3 | -2 | -2 | -3 | -2 |
| -2.7 | -2 | -3 | -3 | -2 |
Math.round。BigDecimal + 明確 RoundingMode。Math.floorDiv (JDK 8+) 或手動處理負數。double 直接比較相等,用 Math.abs(a-b) < epsilon。