4

我想用 java 类计算BigDecimal,但我总是得到周期数的异常。我一直在网上寻找,但不幸的是什么也没找到。也许有人可以帮我解决它。

例子:

System.out.println(new BigDecimal(1).divide(new BigDecimal(3)));  
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;   no exact representable decimal result.  
    at java.math.BigDecimal.divide(Unknown Source)  
    at Berechne.rechne(Berechne.java:16)  
    at Berechne.main(Berechne.java:39)  

System.out.println(new BigDecimal(1).divide(new BigDecimal(4))); --> 0.25

4

2 回答 2

4

您正在尝试除以13这将在小数点后出现重复数字。这就是维基百科所说的:

在算术中,重复小数是表示有理数的一种方式。因此,如果一个数字的十进制表示在某个时刻变成周期性的,即如果存在无限重复的某些有限的数字序列,则称为重复小数(或循环小数)。例如,1/3 = 0.3333333…或 0.3 的十进制表示(称为“0.3 重复”或“0.3 重复”)在小数点后变为周期性,无限重复个位数序列“3”。

您没有指定精度和舍入模式。BigDecimal 抱怨它可以使用无穷大的小数位,但它仍然无法为您提供数字的精确表示。

查看文档

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

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

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

为了避免这种情况,您可以使用divide(BigDecimal divisor, int scale, int roundingMode)

于 2013-07-09T07:28:38.787 回答
3

BigDecimal不能支持不能写为固定长度小数的数字。1/3 就是一个很好的例子。sqrt(2) 或 PI 等无理数是另一种类型。

您需要提供所需的精度和舍入程度。

于 2013-07-09T07:31:16.967 回答