Math.round(x) 等價於 Math.floor(x + 0.5)。即:先加 0.5,再向下取整。
| 輸入 | 計算過程 | 結果 |
|---|---|---|
| 11.5 | floor(11.5 + 0.5) = floor(12.0) | 12 |
| 11.6 | floor(11.6 + 0.5) = floor(12.1) | 12 |
| 11.4 | floor(11.4 + 0.5) = floor(11.9) | 11 |
| 輸入 | 計算過程 | 結果 | 說明 |
|---|---|---|---|
| -11.5 | floor(-11.5 + 0.5) = floor(-11.0) | -11 | 「向零方向」進位 |
| -11.6 | floor(-11.6 + 0.5) = floor(-11.1) | -12 | floor 向負無窮,-11.1 → -12 |
| -11.4 | floor(-11.4 + 0.5) = floor(-10.9) | -11 |
關鍵點:Math.floor 永遠向**負無窮**方向取整,而非截斷小數部。因此 -11.1 → -12,這是負數四捨五入最易踩的坑。
static long round(double a) // 返回 long
static int round(float a) // 返回 int
public class RoundDemo {
public static void main(String[] args) {
double[] vals = {11.5, 11.6, 11.4, -11.5, -11.6, -11.4};
for (double v : vals) {
System.out.printf("Math.round(%.1f) = %d%n", v, Math.round(v));
}
}
}
輸出:
Math.round(11.5) = 12 Math.round(11.6) = 12 Math.round(11.4) = 11 Math.round(-11.5) = -11 Math.round(-11.6) = -12 Math.round(-11.4) = -11
| 環境 | -1.5 結果 | 規則 |
|---|---|---|
| Java Math.round | -1 | 向零方向(Banker's Rounding 變體) |
| Python round() | -2 | 銀行家捨入(最近偶數) |
| C# Math.Round | -2 | 預設銀行家捨入 |
| JavaScript Math.round | -1 | 同 Java(.5 向正無窮) |
BigDecimal 並指定 RoundingMode.HALF_UP(傳統四捨五入)或 HALF_EVEN(銀行家捨入)。String.format("%.0f", val) 或 DecimalFormat,不改變數值本身。HALF_UP:(long) Math.floor(x + 0.5) 對正負數統一「.5 向上」。public static long roundHalfUp(double x) {
return (long) Math.floor(x + 0.5); // 正負數 .5 都向正無窮(遠離零)
}
// 測試
roundHalfUp(-1.5) // -2
roundHalfUp(-1.4) // -1
Java Math.round() 採用「加 0.5 再 floor」算法,導致負數 .5 向零方向進位(-1.5 → -1)。這與傳統「四捨五入」直覺不同,亦非銀行家捨入。金融、統計等嚴格場景請改用 BigDecimal 明確指定捨入模式,避免隱性 Bug。