最标准、最安全的方式是使用 setscale(2, roundingmode.half_up),需用字符串构造 bigdecimal 以避免 double 精度丢失,且该方法返回新对象。

Java 中对 BigDecimal 进行四舍五入并保留两位小数,最标准、最安全的方式是使用 setScale 方法,并明确指定舍入模式为 RoundingMode.HALF_UP。
使用 setScale 指定精度和舍入模式
setScale 是 BigDecimal 自带的核心方法,用于重新设置小数位数并执行舍入。关键点是:必须传入两个参数——目标小数位数(如 2)和舍入模式(不能省略)。
-
正确写法:
bigDecimal.setScale(2, RoundingMode.HALF_UP) -
错误写法(不推荐):
bigDecimal.setScale(2)—— 此方式在 JDK 1.8+ 已被标记为过时,且默认行为依赖构造方式,易出错 -
注意:该方法返回一个新对象(
BigDecimal不可变),原对象不会被修改
避免 double 构造引发的精度丢失
如果原始数据来自 double(比如 new BigDecimal(1.235)),会因二进制浮点数表示误差导致结果异常(如变成 1.234999...),进而影响四舍五入结果。
-
推荐做法:用字符串构造,例如
new BigDecimal("1.235") -
若必须从 double 转换:先转成字符串再构造,如
new BigDecimal(Double.toString(d)) -
示例对比:
new BigDecimal(1.235).setScale(2, HALF_UP)→ 可能得1.23new BigDecimal("1.235").setScale(2, HALF_UP)→ 确保得1.24
常见舍入模式说明(选对才准确)
RoundingMode.HALF_UP 是日常“四舍五入”的标准对应(0–4 向下舍,5–9 向上入)。其他模式容易误解:
-
HALF_UP:经典四舍五入(推荐用于金额) -
HALF_EVEN:银行家舍入(5 前为偶数则舍,为奇数则入),适合统计场景 -
UP:只要小数位非零就进一(如 1.231 → 1.24) -
DOWN:直接截断(如 1.239 → 1.23)
完整示例代码
以下是一个安全、可直接复用的工具方法:
public static BigDecimal roundToTwo(BigDecimal value) {
if (value == null) {
return BigDecimal.ZERO;
}
return value.setScale(2, RoundingMode.HALF_UP);
}
// 使用示例
BigDecimal a = new BigDecimal("12.345");
BigDecimal b = new BigDecimal("9.8765");
System.out.println(roundToTwo(a)); // 输出:12.35
System.out.println(roundToTwo(b)); // 输出:9.88
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











