bigdecimal金额除法必须显式调用divide方法并指定scale=2和roundingmode.half_up,否则无限小数会抛arithmeticexception;推荐封装工具方法统一处理。

<p>BigDecimal 做金额除法时保留 2 位小数,关键不是“配置”,而是显式调用 <strong>divide</strong> 方法并指定 <strong>scale</strong> 和 <strong>RoundingMode</strong>。</p> <h3>必须指定 scale 和 rounding mode</h3> <p>BigDecimal 的 divide() 默认不接受无限小数(如 1 ÷ 3),会直接抛 <font color="red">ArithmeticException</font>。所以不能只写 <code>bigDec.divide(another)</code>,必须明确:</p>
- 保留几位小数(scale = 2)
-
如何处理多余位数(必须选一个 RoundingMode,推荐
RoundingMode.HALF_UP,即四舍五入)
正确写法示例
以 100.00 ÷ 3 计算为例:
<code>BigDecimal a = new BigDecimal("100.00");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 结果为 33.33</code>
注意:
• 第二个参数 2 是 scale(保留 2 位小数)
• 第三个参数是舍入模式,HALF_UP 最符合日常金额习惯(类似数学四舍五入)
避免常见错误
- 不要用
setScale(2)替代 divide 的参数 —— 先 divide 再 setScale 可能因精度丢失引发异常或结果不准 - 不要传 double 构造 BigDecimal(如
new BigDecimal(0.1)),会带来不可控精度问题;应使用字符串构造,如new BigDecimal("0.1") - 如果除数可能为 0,需提前判空或捕获
ArithmeticException
封装成工具方法更安全
项目中建议封装复用:
<code>public static BigDecimal divideMoney(BigDecimal dividend, BigDecimal divisor) {
if (divisor == null || divisor.compareTo(BigDecimal.ZERO) == 0) {
throw new IllegalArgumentException("除数不能为零");
}
return dividend.divide(divisor, 2, RoundingMode.HALF_UP);
}</code>
这样每次调用都统一规则,不易遗漏 scale 和舍入模式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











