BigDecimal除法运算报错 Non-terminating decimal expansion; no exact representable decimal result.

本文介绍了在Java中使用BigDecimal进行除法运算时,如何处理得到的无限循环小数,以及如何通过设置精确位数(如保留10位小数)并使用ROUND_HALF_UP策略进行四舍五入操作。
### 报错原因 使用 `BigDecimal` 进行除法运算时,若调用 `divide()` 方法未指定舍入模式,当除法无法得到精确结果(例如 10/3 = 3.333...),`BigDecimal` 会抛出 `ArithmeticException`,提示 "Non-terminating decimal expansion; no exact representable decimal result" [^1][^2]。 ### 解决办法 在调用 `divide()` 方法时指定舍入模式和保留的小数位数。以下是不同舍入模式的示例代码: #### 四舍五入(`RoundingMode.HALF_UP`) ```java import java.math.BigDecimal; import java.math.RoundingMode; public class RoundingExample { public static void main(String[] args) { BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal("3"); BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); System.out.println(result); } } ``` #### 直接删除多余的小数位(`RoundingMode.DOWN`) ```java import java.math.BigDecimal; import java.math.RoundingMode; public class RoundingDownExample { public static void main(String[] args) { BigDecimal a = new BigDecimal("2.35"); BigDecimal result = a.setScale(1, RoundingMode.DOWN); System.out.println(result); } } ``` #### 进位处理(`RoundingMode.UP`) ```java import java.math.BigDecimal; import java.math.RoundingMode; public class RoundingUpExample { public static void main(String[] args) { BigDecimal a = new BigDecimal("2.35"); BigDecimal result = a.setScale(1, RoundingMode.UP); System.out.println(result); } } ``` #### 向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入(`RoundingMode.HALF_EVEN`) ```java import java.math.BigDecimal; import java.math.RoundingMode; public class RoundingHalfEvenExample { public static void main(String[] args) { BigDecimal a = new BigDecimal("2.35"); BigDecimal result = a.setScale(1, RoundingMode.HALF_EVEN); System.out.println(result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值