在使用BigDecimal
在进行除法计算时,如果商不能被准确的表示(例如 1÷3)则会抛出java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
public static void main(String[] args) {
BigDecimal a=BigDecimal.valueOf(10);
BigDecimal b=BigDecimal.valueOf(3);
BigDecimal c = a.divide(b);// java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
System.out.println(c);
}
此时需要在divide()方法中传入 MathContext 对象或 RoundingMode对象,并指定精度和舍入模式。
public static void main(String[] args) {
BigDecimal a=BigDecimal.valueOf(10);
BigDecimal b=BigDecimal.valueOf(3);
//默认使用除数(本例中的变量a)的精度,也可以指定
BigDecimal c = a.divide(b,RoundingMode.HALF_UP);
//c=3
System.out.println(c);
}
java提供了8中舍入模式
常量名 | 说明 |
---|---|
CEILING | 向正无限大方向舍入。 |
DOWN | 向零方向舍入。 |
FLOOR | 向负无限大方向舍入。 |
HALF_DOWN | 向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向下舍入。 |
HALF_EVEN | 向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 |
HALF_UP | 向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向上舍入。 |
UNNECESSARY | 断言具有精确结果。 |
不同舍入模式下的舍入操作汇总
输入数字 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN | UNNECESSARY |
---|---|---|---|---|---|---|---|---|
5.5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 | 抛出 ArithmeticException |
2.5 | 3 | 2 | 3 | 2 | 3 | 2 | 2 | 抛出 ArithmeticException |
1.6 | 2 | 1 | 2 | 1 | 2 | 2 | 2 | 抛出 ArithmeticException |
1.1 | 2 | 1 | 2 | 1 | 1 | 1 | 1 | 抛出 ArithmeticException |
1.0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
-1.0 | -1 | -1 | -1 | -1 | -1 | -1 | -1 | -1 |
-1.1 | -2 | -1 | -1 | -2 | -1 | -1 | -1 | 抛出 ArithmeticException |
-1.6 | -2 | -1 | -1 | -2 | -2 | -2 | -2 | 抛出 ArithmeticException |
-2.5 | -3 | -2 | -2 | -3 | -3 | -2 | -2 | 抛出 ArithmeticException |
-5.5 | -6 | -5 | -5 | -6 | -6 | -5 | -6 | 抛出 ArithmeticException |