最标准、最安全的方式是使用 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...),进而影响四舍五入结果。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
推荐做法:用字符串构造,例如
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 向上入)。其他模式容易误解:
立即学习“Java免费学习笔记(深入)”;
-
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

















