ArithmeticException:“非终止十进制扩展;没有精确可表示的十进制结果”

新手上路,请多包涵

为什么以下代码会引发如下所示的异常?

 BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.

例外:

 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

Java 11 BigDecimal 文档

MathContext 对象的精度设置为 0(例如 MathContext.UNLIMITED )时,算术运算是精确的,就像不采用 MathContext 的算术方法一样 --- 对象。 (这是 5 之前的版本中唯一支持的行为。)

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

如果商具有非终止十进制扩展并且指定操作返回精确结果,则抛出 ArithmeticException 。否则,将返回除法的确切结果,就像其他操作一样。

要修复,您需要执行以下操作

 a.divide(b, 2, RoundingMode.HALF_UP)

其中 2 是比例,RoundingMode.HALF_UP 是舍入模式

有关更多详细信息,请参阅 此博客文章

原文由 DVK 发布,翻译遵循 CC BY-SA 4.0 许可协议

因为您没有指定精度和舍入模式。 BigDecimal 抱怨它可以使用 10、20、5000 或无限小数位,但它仍然无法为您提供数字的精确表示。因此,它不会给你一个不正确的 BigDecimal,它只会向你抱怨。

但是,如果您提供 RoundingMode 和精度,那么它将能够将(例如 1.333333333 到无穷大转换为 1.3333 之类的东西……但是作为程序员,您需要告诉它您对什么精度感到满意’.

原文由 David Bullock 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题