Math.round 在 Java 中并非数学四舍五入,而是对 float 加 0.5f、double 加 0.5d 后向下取整;故 -2.5 → -2,-0.5 → 0;需严格 HALF_UP 规则时应使用 BigDecimal 字符串构造配合 setScale。

Math.round 在 Java 中并不是简单的“四舍五入”,而是“四舍五入到最近的整数,.5 向上取整(正数)或向下取整(负数)”,本质是加 0.5 后再向下取整(对 float)或加 0.5L 后再向下取整(对 double)。
round 的底层逻辑:先加偏移再 floor
Java 的 Math.round(float) 等价于:
(int)Math.floor(f + 0.5f)
Math.round(double) 等价于:
(long)Math.floor(d + 0.5d)
这意味着:
- 对正数:0.5 → 1.0 → floor 后为 1;0.49 → 0.99 → floor 后为 0
- 对负数:-0.5 → 0.0 → floor 后为 0(注意!不是 -1);-1.5 → -1.0 → floor 后为 -1
- 所以 -0.5 会 round 到 0,-1.5 会 round 到 -1 —— 这和数学上常说的“四舍五入”(-0.5 → -1)不一致
常见易错案例
这些结果常让人困惑:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- Math.round(2.5) → 3 ✔️(符合直觉)
- Math.round(-2.5) → -2 ❌(不是 -3!因为 -2.5 + 0.5 = -2.0,floor(-2.0) = -2)
- Math.round(0.4999999f) → 0,但 Math.round(0.5f) → 1
- 浮点精度问题:Math.round(2.4999999999999996) 可能变成 2,而 2.4999999999999996 + 0.5 在 double 下可能溢出为 3.0 → 结果为 3(极罕见但存在)
想真正按数学规则四舍五入?用 BigDecimal
如果需要严格遵循“.5 总是向远离零方向舍入”(即 -2.5 → -3),推荐用 BigDecimal:
- new BigDecimal("2.5").setScale(0, RoundingMode.HALF_UP).intValue() → 3
- new BigDecimal("-2.5").setScale(0, RoundingMode.HALF_UP).intValue() → -3
- 注意:必须用字符串构造 BigDecimal,避免 double 字面量的精度丢失(如 new BigDecimal(2.5) 实际可能是 2.499999999999999...)
小数位保留?别只靠 round
Math.round 只能取整。若要保留 1 位小数并四舍五入:
- 先放大:乘以 10
- 再 round:Math.round(x * 10)
- 最后缩小:/ 10.0
- 例如:Math.round(3.14159 * 10) / 10.0 → 3.1;Math.round(3.15 * 10) / 10.0 → 3.2
- 但注意:double 运算仍有精度风险,高精度场景仍建议 BigDecimal

















