商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java中 BigDecimal divide 除不尽抛出 Non-terminating decimal expansion 异常怎么解决

Java中 BigDecimal divide 除不尽抛出 Non-terminating decimal expansion 异常怎么解决

  发布于2026-07-15 阅读(0)

扫一扫,手机访问

应使用带 scaleRoundingMode 参数的 divide 方法,如 bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP),并根据业务选择合适舍入模式与合理精度,避免无参调用导致 ArithmeticException

Ja va中 BigDecimal divide 除不尽抛出 Non-terminating decimal expansion 异常怎么解决

Ja va 里用 BigDecimal.divide 抛出 ArithmeticException: Non-terminating decimal expansion,原因其实很简单:你调的是不带精度参数的重载——只传了两个 BigDecimal,而除数除不尽,又没有指定舍入规则和小数位数,JVM 直接懵了,扔出一个异常告诉你“我算不下去了”。

明确使用带 scale 和 RoundingMode 的 divide 方法

这是最直接、也最推荐的解决方式。别偷懒,必须显式告诉 JVM 保留几位小数、用什么舍入模式。否则它自己根本不知道该怎么处理无限小数。

  • 别这么写bigDec1.divide(bigDec2) —— 分分钟抛异常。
  • 应该这么写:bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP) —— 保留两位小数,四舍五入,稳稳当当。

选择合适的 RoundingMode

不同业务场景对舍入的容忍度差远了,不能一招鲜全用 HALF_UP。常见选项和适用场景列出来,方便你按需选:

  • RoundingMode.HALF_UP:标准四舍五入,金融计算最常用。
  • RoundingMode.HALF_DOWN:五舍六入,某些会计规则会用到。
  • RoundingMode.DOWN:直接截断,比如算折扣后价格下限时用。
  • RoundingMode.UP:向上进位,运费计算很常见。
  • RoundingMode.CEILING 向正无穷取整,FLOOR 向负无穷取整。

注意 scale 值要合理,避免精度丢失或过度保留

scale 不是越大越好。设小了精度丢失,设大了可能带出一堆无效末尾零,甚至影响性能。

  • 货币计算通常用 2(元角分)或 4(支持厘、毫)。
  • 科学计算根据有效数字要求来,比如 610
  • 如果不确定,可以先用 MathContext 封装精度和舍入:bigDec1.divide(bigDec2, new MathContext(10, RoundingMode.HALF_UP))

提前判断是否能整除(可选,适用于必须精确结果的场景)

如果你的业务逻辑要求“必须整除”,那最好在调用除法前先检查余数是否为零:

  • remainder 方法判断:if (bigDec1.remainder(bigDec2).compareTo(BigDecimal.ZERO) == 0)
  • 确认能整除后,再执行 divide(此时可以用无参版本,因为一定整除)。
  • 否则按业务需要报错或走备用逻辑,比如转用带舍入的版本。
本文转载于:https://www.php.cn/faq/2822822.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。