当前位置: 首页 > 知识库问答 >
问题:

大十进制周期数[重复]

仰钧
2023-03-14

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

系统出来println(新的BigDecimal(1)。除法(新的BigDecimal(4))--

共有2个答案

唐利
2023-03-14

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

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

时同
2023-03-14

您正在尝试将1除以3,小数点后会出现循环数。维基百科是这么说的:

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

您没有指定精度和四舍五入模式。BigDecimal抱怨说它可以使用无穷大的小数位,但它仍然不能给你一个确切的数字表示。

查看文档:

当MathContext对象的精度设置为0(例如,MathContext. UNLIMITED)时,算术操作是精确的,不使用MathContexthtml" target="_blank">对象的算术方法也是如此。(这是5之前版本中唯一支持的行为。)

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

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

为了避免这种情况,可以使用divide(BigDecimal除数、int scale、int roundingMode)

 类似资料:
  • 在我的代码中 当我运行程序时,它抛出一个数字格式异常 我做错了什么?这似乎相对简单,但不起作用。

  • 这个BigDecimalSorting的问题是什么?代码将数字作为字符串,然后将其转换为BigDecimal,然后排序并打印排序后的BigDecimals。 样本输入:9 -100 50 0 56.6 90 0.12 .12 02.34 000.000 预期产量:9056.6502.340.12.12000.000-100

  • 这是一个考题,我想一定有更有效的方法。(我也知道有一种方法可以直接转换二进制数,而不需要经过二进制字符串,但我不知道如何转换)。 这就是问题所在: 给出了一个由Q字符组成的非空零索引字符串S。该字符串的周期是最小的正整数P,使得: P≤ Q/2和S[K]=S[kp]表示0≤ K 例如,8是“Codilityco”的时期。如果M是N的二进制表示的周期,则正整数M是正整数N的二进制周期。 例如,4是9

  • 主要内容:二进制数、八进制数和十六进制数的表示,二进制数、八进制数和十六进制数的输出C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。 二进制数、八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。 1) 二进制 二进制由 0 和 1 两个数字组成,使用时必须以

  • 我想设置两个BigDecimal数字和的比例。如本例所示: 当我运行时,我有一个例外: 为什么四舍五入是必要的?如果我不想让周围,什么是解决方案? 谢谢

  • 所以我正在做一个脚本,把两个数字(十进制数字)加在一起,这我遇到了一个问题。 http://jsfidle.net/derekl/esqnc/ 我做的剧本,结果很好: 但很快我就明白了: