【问题标题】:Big Decimal periodic number [duplicate]大十进制周期数[重复]
【发布时间】:2013-07-06 17:08:56
【问题描述】:

我想用 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

【问题讨论】:

标签: java bigdecimal arithmeticexception


【解决方案1】:

您试图将1 除以3,这将在小数点后出现重复数字。 这就是wikipedia 所说的:

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

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

documentation

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

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

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

要绕过这个,你可以使用divide(BigDecimal divisor, int scale, int roundingMode)

【讨论】:

  • 要修复,您需要执行以下操作:a.divide(b, 2, RoundingMode.HALF_UP) 其中 2 是精度,RoundingMode.HALF_UP 是舍入模式
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2013-06-13
    • 2017-09-28
    • 2017-12-30
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多