报错Non-terminating decimal expansion; no exact representable decimal result
异常代码:
BigDecimal.valueOf(100).divide(BigDecimal.valueOf(5))
.setScale(2, RoundingMode.HALF_UP)
出现该错误的原因是:在调用 BigDecimal.divide()
方法时,除法运算的结果是一个无限不循环小数(例如 1/3 = 0.333...
),而代码中未在除法运算阶段指定舍入模式(Rounding Mode),导致无法精确表示结果。
错误分析:
divide()
方法调用时未指定舍入模式。当除法无法得到精确结果时(例如 10/3 = 3.333...
),BigDecimal
会抛出 ArithmeticException
,提示 "Non-terminating decimal expansion"。
修复方法:
在除法运算时直接指定舍入模式和精度,而不是在除法之后才设置精度。修改后的代码如下:
BigDecimal.valueOf(100)
.divide(BigDecimal.valueOf(5), 2, RoundingMode.HALF_UP)
.doubleValue()
改进点:
- 正确使用除法:通过
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
方法,在除法阶段指定结果的小数位数和舍入模式,确保运算合法。 - 简化代码:合并
setScale(2, RoundingMode.HALF_UP)
到divide()
方法中,减少冗余操作。
总结:
BigDecimal
的除法操作必须处理无限小数的情况。通过在 divide()
中直接指定精度和舍入模式,可以避免异常并确保计算结果的正确性。