首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Math.round() 四捨五入規則深度解析:正負數邊界情況

     編輯:Java 相關知識

核心算法

Math.round(x) 等價於 Math.floor(x + 0.5)。即:先加 0.5,再向下取整。

正數範例

輸入計算過程結果
11.5floor(11.5 + 0.5) = floor(12.0)12
11.6floor(11.6 + 0.5) = floor(12.1)12
11.4floor(11.4 + 0.5) = floor(11.9)11

負數陷阱(重點)

輸入計算過程結果說明
-11.5floor(-11.5 + 0.5) = floor(-11.0)-11「向零方向」進位
-11.6floor(-11.6 + 0.5) = floor(-11.1)-12floor 向負無窮,-11.1 → -12
-11.4floor(-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 向正無窮)

實務建議

  1. 金融計算避免 float/double:使用 BigDecimal 並指定 RoundingMode.HALF_UP(傳統四捨五入)或 HALF_EVEN(銀行家捨入)。
  2. 單純顯示格式化:用 String.format("%.0f", val) 或 DecimalFormat,不改變數值本身。
  3. 需精確控制負數行為:自行實現工具方法,如 HALF_UP:(long) Math.floor(x + 0.5) 對正負數統一「.5 向上」。

自定義 HALF_UP 實現

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。

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