roundingmode.half_up 是最接近日常“四舍五入”的模式:舍弃部分≥0.5时进位,否则舍去;其核心是比较整个舍弃部分与保留位最小单位的一半,而非仅看末位数字。

RoundingMode.HALF_UP 是 BigDecimal 中最接近日常“四舍五入”的模式:当舍弃部分大于等于 0.5 时进位,小于 0.5 时舍去。
HALF_UP 的核心规则
它不是简单看最后一位数字,而是比较要保留位数后的**整个舍弃部分**与“保留位最小单位的一半”:
- 例如保留小数点后 1 位,最小单位是 0.1,一半就是 0.05;
- 若舍弃部分 ≥ 0.05(如 0.123 → 舍弃部分是 0.023,
- 对整数也适用:如
new BigDecimal("123").setScale(0, RoundingMode.HALF_UP)不变,但new BigDecimal("125").setScale(-1, RoundingMode.HALF_UP)表示保留到十位,即看个位是否 ≥ 5 → 125 → 130。
常见用法示例
通常配合 setScale(int scale, RoundingMode mode) 使用:
-
new BigDecimal("3.14159").setScale(2, RoundingMode.HALF_UP)→3.14(舍弃部分 0.00159 -
new BigDecimal("2.675").setScale(2, RoundingMode.HALF_UP)→2.68(舍弃部分 0.005 == 0.005,进位); -
new BigDecimal("1.5").setScale(0, RoundingMode.HALF_UP)→2(舍弃部分 0.5 == 0.5,进位)。
注意浮点数构造陷阱
别用 double 构造 BigDecimal,否则精度已失真:
- ❌
new BigDecimal(1.235).setScale(2, RoundingMode.HALF_UP)可能得 1.23(因为 1.235 在 double 中实际存储为略小于 1.235 的值); - ✅ 应写成
new BigDecimal("1.235").setScale(2, RoundingMode.HALF_UP)→ 确保得到 1.24。
和 Math.round 的区别
Math.round(double) 对正数也是“四舍五入”,但它基于 long 截断,且输入是 double,有精度风险;而 BigDecimal + HALF_UP 是精确、可控、任意精度的四舍五入,适用于金额、科学计算等严谨场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











