我想用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
答案 0 :(得分:3)
您试图将1
除以3
,这将在小数点后有经常性的数字。
这就是wikipedia所说的:
在算术中,重复十进制是表示有理数的一种方式。因此,数字的十进制表示称为重复十进制(或重复十进制),如果在某些时刻它变为周期性的,即,如果有一些有限的数字序列无限重复。例如, 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)
答案 1 :(得分:2)
BigDecimal
不能支持无法写为固定长度小数的数字。 1/3就是一个很好的例子。像sqrt(2)或PI这样的非理性数字是另一种类型。
您需要提供所需的精度和舍入程度。