1. 背景
在使用 BigDecimal 的 divide() 对两个数相除时,报了如题的错误。
public class Test {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(1);
BigDecimal b2 = new BigDecimal(3);
System.out.println(b1.divide(b2));
// System.out.println(b1.divide(b2,2,4));
}
}
输出:
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1690)
at wenjian.Test.main(Test.java:18)
这是因为除不尽,即结果是无限小数导致的。
2. 方法
查看 API 发现 divide() 还有几个重载的方法:
其中有的方法还可以传入指定精度和舍入模式。
舍入模式有很多种,看了几篇文章,推荐一个大佬的:
BigDecimal里面八种舍位模式
3. 修正
public class Test {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal(1);
BigDecimal b2 = new BigDecimal(3);
// System.out.println(b1.divide(b2,2));
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_UP)); // BigDecimal.ROUND_UP 也可以直接写 0
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_DOWN));
System.out.println(b1.divide(b2,2,4));
System.out.println("----------");
// BigDecimal 还可以 setScale() 设置精度
System.out.println(new BigDecimal(1.2067).setScale(2, BigDecimal.ROUND_UP));;
}
}
输出:
0.34
0.33
0.33
----------
1.21
(图网,侵删)