Java 大十进制周期数

Java 大十进制周期数,java,bigdecimal,arithmeticexception,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 represe

我想用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(新的BigDecimal(1).除法(新的BigDecimal(4));-->0.25

您正在尝试将
1
除以
3
,小数点后将有循环数。 这是政府所说的:

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

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

看看下面的例子:

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

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

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


为了避免这种情况,您可以使用

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


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

要解决此问题,您需要执行以下操作:a.除法(b,2,舍入模式。半向上),其中2表示精度,半向上表示舍入模式