大十进制数周期

这个问题已经在这里有一个答案:

  • ArithmeticException:“非十进制扩展; 没有确切表示的十进制结果“5答案

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

--------------解决方案-------------

您正在试图除以13 ,这将有小数点后复发的数字。 这是维基百科这样说:

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

你不是指定的精度和舍入模式。 BigDecimal的抱怨,它可以用无穷小数,它仍然不能够给你数的确切表示。

查看文档:

当为MathContext对象为0的精度设置(例如,MathContext.UNLIMITED)时提供的,算术运算是准确的,因为它们是不采用任何MathContext对象的算术方法。 (这是在之前的版本5.支持的唯一行为)

为计算准确结果的必然结果,不使用0的精度设置一个MathContext对象的舍入模式设置,因此无关紧要。 在除法中,准确的现状tient可能是一个无限长的十进制扩展; 例如,1除以3。

如果商具有无穷的十进制扩展,但是指定了该操作返回准确结果,则抛出ArithmeticException。 否则,该师的准确结果返回,至于其他的操作完成。

为了克服这一点,你可以使用鸿沟(BigDecimal的除数,int标,诠释则roundingMode)

BigDecimal不能支持不能被写入作为固定长度的十进制数。 1/3是这方面的一个很好的例子。 像的sqrt(2)或PI无理数是另一种类型。

您需要提供的精确度和舍入你想要的。

分类:java的 时间:2013-02-23 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.031 (s). 10 q(s)