BigDecimal除法抛出ArithmeticException,已做舍入仍报错求助
解决BigDecimal除法引发的ArithmeticException问题
你遇到的这个问题确实挺闹心的——明明已经做了舍入处理,怎么还会弹出「非终止小数无法精确表示」的错误?我来帮你梳理几个最常见的原因和对应的解决办法:
1. 除法方法没指定精度和舍入模式
BigDecimal的divide方法有多个重载版本,如果你只传入了除数,哪怕你提前对被除数/除数做了舍入,依然会触发这个异常。比如这种写法肯定会报错:
// 错误示例:仅传入除数,未指定舍入规则 BigDecimal result = new BigDecimal("7").divide(new BigDecimal("3"));
正确的做法是在除法操作时直接指定精度和舍入模式,比如:
// 正确示例:保留3位小数,四舍五入 BigDecimal result = new BigDecimal("7").divide(new BigDecimal("3"), 3, RoundingMode.HALF_UP);
2. 舍入操作没作用在除法步骤上
如果你只是单独对被除数或除数做了舍入,但除法本身还是用了无舍入的重载方法,那等于白做。比如:
// 错误示例:仅舍入输入值,除法未带舍入规则 BigDecimal num1 = new BigDecimal("7").setScale(2, RoundingMode.HALF_UP); BigDecimal num2 = new BigDecimal("3"); BigDecimal result = num1.divide(num2); // 这里依然会报错
一定要确保除法操作本身带上舍入参数,而不是只处理输入值。
3. 选错了舍入模式
如果你指定的舍入模式是RoundingMode.UNNECESSARY,那只要除法结果无法精确表示,就会直接抛出异常——哪怕你设置了精度也没用。比如:
// 错误示例:使用了UNNECESSARY模式 BigDecimal result = new BigDecimal("7").divide(new BigDecimal("3"), 2, RoundingMode.UNNECESSARY);
这种情况要换成适合的舍入模式,比如HALF_UP(四舍五入)、FLOOR(向下取整)、CEILING(向上取整)等。
4. 存在未处理的除法分支
可能你只处理了部分除法逻辑,代码里还有其他地方的divide()调用没加舍入参数。建议全局搜索代码里的divide(,逐一检查所有调用是否都指定了精度和舍入模式。
如果能把你的代码片段贴出来,我可以更精准地帮你定位问题哦!
内容的提问来源于stack exchange,提问作者Tejal
相关产品推荐
相关产品推荐

