Math.round()将double四舍五入为long,规则是floor(x + 0.5);对.5结尾数总向正无穷舍入,如Math.round(-2.5)得-2而非-3。

Math.round() 会将 double 四舍五入到最接近的 long,其核心规则是:**加 0.5 后向下取整(即 floor(x + 0.5))**。对 .5 结尾的数,它**总是向正无穷方向舍入**——也就是“**.5 向上取整**”,但要注意:这个“向上”是数学意义上的,对负数而言结果反而更“大”(即更靠近零)。
Math.round(double) 的实际计算逻辑
Java 中 Math.round(double a) 的定义等价于:
(long)Math.floor(a + 0.5d)
这意味着它不是简单判断小数部分是否 ≥0.5,而是先加 0.5,再执行 Math.floor(向负无穷取整)。这直接决定了 .5 值的行为:
-
Math.round(2.5)→floor(3.0)= 3 -
Math.round(-2.5)→floor(-2.0)= -2(不是 -3) -
Math.round(0.5)→floor(1.0)= 1 -
Math.round(-0.5)→floor(0.0)= 0
为什么 -2.5 会变成 -2 而不是 -3?
因为 floor(-2.0) 就是 -2;而 floor 对整数不改变值。关键在加 0.5 这一步:
-2.5 + 0.5 = -2.0 → floor(-2.0) = -2。
它不是“离零取整”,也不是“偶数舍入”,而是严格遵循 floor(x + 0.5) 公式。
与常见误解的对比
- ❌ 不是“银行家舍入”(四舍六入五成双)
- ❌ 不是“向零取整”(如
(long)x截断) - ❌ 不是“对称四舍五入”(比如 -2.5 → -3)
- ✅ 是“加 0.5 后向下取整”,对所有实数统一适用
安全转为 long 的写法
由于 Math.round(double) 返回 long,可直接赋值:
double d = 3.7;
long l = Math.round(d); // l == 4
注意:若 d 超出 long 表示范围(如 Double.MAX_VALUE),结果会溢出为 Long.MAX_VALUE 或 Long.MIN_VALUE,必要时应先校验范围。

















