当前位置: 首页 > 知识库问答 >
问题:

Arithmetic异常:"非终止小数展开;没有精确可表示的小数结果"

姜玮
2023-03-14

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

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.

共有3个答案

逄俊贤
2023-03-14

你能行

a.divide(b, MathContext.DECIMAL128)

您可以选择所需的位数:32、64或128。

查看此链接:

http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6

楚宪
2023-03-14

因为您没有指定精度和舍入模式。BigDecimal抱怨它可能会使用10、20、5000或无限小数位,但它仍然无法给出数字的精确表示。因此,它不是给你一个错误的大小数,而是在抱怨你。

然而,如果你提供一个RoundingMode和一个精度,那么它将能够转换(例如,1.333到无穷大到1.3333…但是作为程序员,你需要告诉它你“满意”的精度。

梁鸿风
2023-03-14

从Java 11BigDecimaldocs:

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

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

如果商具有非终止十进制扩展,并且指定该操作以返回精确结果,则会引发算术异常。否则,将返回除法的确切结果,就像其他操作一样。

要修复,你需要做这样的事情:

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

其中2是比例和圆化模式。半向上是四舍五入模式

有关更多详细信息,请参阅本文。

 类似资料: