大十进制周期数

时间:2013-07-09 07:25:07

标签: java bigdecimal arithmeticexception

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

2 个答案:

答案 0 :(得分:3)

您试图将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)

答案 1 :(得分:2)

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

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