小编典典

ArithmeticException:“非终止十进制扩展;没有精确可表示的十进制结果”

all

为什么以下代码会引发如下所示的异常?

BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.

例外:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

阅读 194

收藏
2022-03-08

共1个答案

小编典典

来自Java
11BigDecimal文档

MathContext对象的精度设置为
0(例如)时,算术运算是精确的,就像不带对象MathContext.UNLIMITED的算术方法一样。MathContext(这是
5 之前的版本中唯一支持的行为。)

作为计算精确结果的必然结果,MathContext不使用精度设置为 0
的对象的舍入模式设置,因此不相关。在除法的情况下,精确商可以有一个无限长的小数展开;例如,1 除以 3。

如果商具有非终止的十进制扩展并且指定操作返回精确结果,ArithmeticException则抛出
an。否则,将返回除法的确切结果,就像其他操作一样。

要修复,您需要执行以下操作

a.divide(b, 2, RoundingMode.HALF_UP)

其中 2 是比例,RoundingMode.HALF_UP 是舍入模式

2022-03-08