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

是什么导致BigDecimal的“非终止十进制扩展”异常。分[重复]

邹正阳
2023-03-14

我以前用过大小数,但不太经常,今天早上我正在做一些事情,我一直得到以下例外:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1594)

我试图设置规模,并使用四舍五入来消除这样的问题:

    BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("result: " + bd3);

然而,我一直得到同样的例外。有人能告诉我哪里出了错吗?

共有3个答案

池麒
2023-03-14

该问题是由操作(除法)引起的,该操作将导致小数重复出现。

解决方案是在执行除法时指定刻度,例如:

BigDecimal one = new BigDecimal("1");
BigDecimal three = new BigDecimal("3");
BigDecimal oneDivThree = one.divide(three, 200, RoundingMode.HALF_UP);
范安歌
2023-03-14

问题就在这里

bd1.divide(bd2)

您需要使用一种采用舍入模式(以各种形式)的重载分割()方法-您不能在分割后进行舍入,因为对于非终止分数,中间结果要么已经需要舍入,要么需要无限的存储空间。

周洋
2023-03-14

使用divide时,如果精确结果有无限个小数,则应使用MathContextRoundingMode

你的情况就是这样:

MathContext mc = new MathContext(2, RoundingMode.HALF_UP) ;
BigDecimal bd3 = bd1.divide(bd2, mc);

或者,使用取整模式调用divide,以使用分子的刻度(bd1,在下面的示例中):

BigDecimal bd3 = bd1.divide(bd2, RoundingMode.HALF_UP);
 类似资料:
  • 我参考了这一点,并对值进行了四舍五入,然后我也得到了上述错误。请查找下面提到的代码。提前感谢:

  • 本文向大家介绍什么是PowerShell中的终止和非终止错误?,包括了什么是PowerShell中的终止和非终止错误?的使用技巧和注意事项,需要的朋友参考一下 Powershell执行脚本或命令时会生成两种类型的错误。终止错误和非终止错误。 终止错误-该错误是由您创建的脚本,函数或命令生成的,并且会停止或停止脚本的执行,从而导致下一行中的命令无法执行。要处理此错误,需要适当的机制,否则将显示错误消

  • 问题内容: 这个问题已经在这里有了答案 : BigInteger是否有上限?[重复] (3个答案) 没有限制的BigInteger是什么意思? (4个答案) 7年前关闭。 我在程序中将两个非常大的BigIntegervalues相乘。失败了 和的限制是什么? 问题答案: 您不会将NumberFormatException与大数字相乘。如果生成的数字太大,则在数组大小溢出时,您将得到一个神秘的Neg

  • 扩展是可定制化浏览体验的小程序,它们使用户可以根据个人需要或者偏好定制 Chrome 的功能和行为。它们基于 Web 技术(例如 HTML,JavaScript 和 CSS)构建。 扩展必须满足狭义定义且易于理解的单一目的(译者注:功能简单易懂化)。一个扩展可以包括多个组件和一系列功能,只要所有的内容都有助于实现共同的目标。 用户交互界面应尽量小且有意图。他们的范围从简单的图标,如右侧显示的 Go

  • 问题内容: 为什么以下代码会引发如下所示的异常? 例外: 问题答案: 从Java 11 BigDecimal文档: 当为对象提供的精度设置为0(例如MathContext.UNLIMITED)时,算术运算是精确的,不带对象的算术方法也是如此。(这是5之前的版本中唯一支持的行为。) 作为计算精确结果的必然结果,不使用精度设置为0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可以具有无限

  • 应用程序可以持久化用户,以后可以修改。最近无法修改用户,引发了异常。用户实体被持久化,没有错误或验证。有人知道是什么导致了这种行为,或者我如何找到更多细节吗?