Math.round()对.5的处理是加0.5后向下取整(floor(x+0.5)),故2.5→3、-2.5→-2、0.5→1、-0.5→0;正数遇.5进一,负数遇.5向零取整,非银行家舍入。

Math.round() 对 .5 的处理不是“看小数位是否等于 5 就进一”,而是统一执行 加 0.5 后向下取整(floor(x + 0.5))。这个公式决定了它在正负数上表现不一致,但逻辑完全确定。
核心识别方法:代入公式验证
遇到任意带 .5 的数,直接套用 x + 0.5 → floor(结果),就能准确预测输出:
- Math.round(2.5) → floor(2.5 + 0.5) = floor(3.0) = 3
- Math.round(-2.5) → floor(-2.5 + 0.5) = floor(-2.0) = -2
- Math.round(0.5) → floor(0.5 + 0.5) = floor(1.0) = 1
- Math.round(-0.5) → floor(-0.5 + 0.5) = floor(0.0) = 0
快速判断口诀(适用于 Java 和 JavaScript)
记住三句话,不用算也能秒判:
- 正数遇 .5,一定进一(如 4.5 → 5)
- 负数遇 .5,原地不动(向零靠拢)(如 -4.5 → -4)
- 小数部分 0.5,按符号方向进一(如 -3.7 → -4,因为 -3.7 + 0.5 = -3.2 → floor = -4)
常见误区辨析
别被名字或直觉误导:
- ❌ 不是“银行家舍入”:Math.round(2.5) = 3,不是 2;Math.round(3.5) = 4,不是 4(虽结果碰巧对,但原理不同)
- ❌ 不是“对称四舍五入”:-2.5 不变成 -3,说明它不以绝对值为基准
- ❌ 不是“向零取整”:Math.round(-2.6) = -3,说明它会越过零向下走
- ✅ 唯一可靠依据就是 floor(x + 0.5),全场景通用
为什么建议用 BigDecimal 替代 Math.round() 做业务四舍五入?
当需要真正符合数学习惯的四舍五入(比如金额、评分、报表),Math.round() 的负数行为容易引发偏差:
- 用户期望 -2.5 → -3,但 Math.round() 给出 -2
- 金融系统要求严格一致,必须用
new BigDecimal("x").setScale(0, RoundingMode.HALF_UP) - 注意:必须用字符串构造 BigDecimal,避免 double 字面量精度污染










