BigDecimal.divide()必须指定scale和RoundingMode,否则除不尽时抛ArithmeticException;推荐使用三参数重载方法,scale为非负整数表示小数位数,RoundingMode控制舍入规则,如HALF_UP四舍五入,并避免double构造导致精度误差。

Java 中 BigDecimal.divide() 方法必须指定小数位数和舍入模式,否则当除不尽时会抛出 ArithmeticException(如 1 除以 3)。关键在于使用带三个参数的重载方法:divide(BigDecimal divisor, int scale, RoundingMode roundingMode)。
指定小数位数(scale)和舍入模式(RoundingMode)
scale 表示结果保留的小数位数(非有效数字位数),必须是非负整数;RoundingMode 决定如何处理多余位数。常用模式有:
-
RoundingMode.HALF_UP:四舍五入(最常用,如 2.5 → 3,-2.5 → -3) -
RoundingMode.HALF_DOWN:五舍六入(2.5 → 2,-2.5 → -2) -
RoundingMode.HALF_EVEN:银行家舍入(四舍六入、奇进偶不进,避免统计偏差) -
RoundingMode.DOWN:直接截断(向零方向,2.9 → 2,-2.9 → -2) -
RoundingMode.UP:向上取整(远离零,2.1 → 3,-2.1 → -3)
正确调用 divide 的写法示例
以下代码将 10 除以 3,保留 2 位小数,按四舍五入处理:
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 结果为 3.33
注意:两个操作数都应使用字符串构造(如 "10"),避免 double 构造带来的精度误差(如 new BigDecimal(0.1) 实际是 0.10000000000000000555…)。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
避免常见错误
以下写法容易出错:
- 只传两个参数(如
a.divide(b))→ 除不尽时直接抛异常 - 用
int或double直接构造 BigDecimal → 引入浮点误差 - scale 设为负数 → 抛
IllegalArgumentException - 误用
setScale()替代divide()的舍入 → 先除后设精度可能因中间结果精度丢失而失准
如果需要动态控制精度和模式
可把 scale 和 RoundingMode 作为方法参数传入,便于复用:
public static BigDecimal safeDivide(BigDecimal dividend, BigDecimal divisor,
int scale, RoundingMode mode) {
if (divisor.equals(BigDecimal.ZERO)) {
throw new ArithmeticException("Division by zero");
}
return dividend.divide(divisor, scale, mode);
}
调用时明确传入所需精度和规则,逻辑清晰且不易遗漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










