发布于2026-07-15 阅读(0)
扫一扫,手机访问
应使用带scale和RoundingMode参数的divide方法,如bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP),并根据业务选择合适舍入模式与合理精度,避免无参调用导致ArithmeticException。

Ja va 里用 BigDecimal.divide 抛出 ArithmeticException: Non-terminating decimal expansion,原因其实很简单:你调的是不带精度参数的重载——只传了两个 BigDecimal,而除数除不尽,又没有指定舍入规则和小数位数,JVM 直接懵了,扔出一个异常告诉你“我算不下去了”。
这是最直接、也最推荐的解决方式。别偷懒,必须显式告诉 JVM 保留几位小数、用什么舍入模式。否则它自己根本不知道该怎么处理无限小数。
bigDec1.divide(bigDec2) —— 分分钟抛异常。bigDec1.divide(bigDec2, 2, RoundingMode.HALF_UP) —— 保留两位小数,四舍五入,稳稳当当。不同业务场景对舍入的容忍度差远了,不能一招鲜全用 HALF_UP。常见选项和适用场景列出来,方便你按需选:
RoundingMode.HALF_UP:标准四舍五入,金融计算最常用。RoundingMode.HALF_DOWN:五舍六入,某些会计规则会用到。RoundingMode.DOWN:直接截断,比如算折扣后价格下限时用。RoundingMode.UP:向上进位,运费计算很常见。RoundingMode.CEILING 向正无穷取整,FLOOR 向负无穷取整。scale 不是越大越好。设小了精度丢失,设大了可能带出一堆无效末尾零,甚至影响性能。
2(元角分)或 4(支持厘、毫)。6 或 10。MathContext 封装精度和舍入:bigDec1.divide(bigDec2, new MathContext(10, RoundingMode.HALF_UP))。如果你的业务逻辑要求“必须整除”,那最好在调用除法前先检查余数是否为零:
remainder 方法判断:if (bigDec1.remainder(bigDec2).compareTo(BigDecimal.ZERO) == 0)divide(此时可以用无参版本,因为一定整除)。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8