一、四则运算
// 测试四则运算
@Test
public void test1() {
BigDecimal num1 = new BigDecimal(4);
BigDecimal num2 = new BigDecimal(2);
//加法运算 add
BigDecimal resultAdd = num1.add(num2);
//减法运算 subtract
BigDecimal resultSubtract = num1.subtract(num2);
//乘法运算 multiply
BigDecimal resultMultiply = num1.multiply(num2);
//除法运算 divide
BigDecimal resultDivide = num1.divide(num2);
System.out.println("加法结果:" + resultAdd);
System.out.println("减法结果:" + resultSubtract);
System.out.println("乘法结果:" + resultMultiply);
System.out.println("除法结果:" + resultDivide);
}
结果:
加法结果:6
减法结果:2
乘法结果:8
除法结果:2
二、精度计算
// 测试精度
@Test
public void test2() {
BigDecimal num1 = new BigDecimal(1);
BigDecimal num2 = new BigDecimal(3);
try {
BigDecimal resultDivide = num1.divide(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("除法结果:" + resultDivide);
} catch (Exception e) {
System.out.println("异常:" + e.getMessage());
}
BigDecimal resultDivide = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println("除法结果:" + resultDivide);
}
结果:
异常:Non-terminating decimal expansion; no exact representable decimal result.
除法结果:0.33
由上面可以看出在进度丢失的时候会发生异常,在运算的时候进行进度运算是没有问题的,这里要用到精度计算方式,这里BigDecimal.ROUND_HALF_UP
是四舍五入。
其他精度方式:
1、ROUND_UP
向上舍入模式,无论舍弃的数是多少都向上进位
2、ROUND_DOWN
向下舍入模式,无论舍弃的数是多少都不进位
3、ROUND_CEILING
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果 BigDecimal 为负,则舍入行为与 ROUND_DOWN 相同。
4、ROUND_FLOOR
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果 BigDecimal 为负,则舍入行为与 ROUND_UP 相同。
5、ROUND_HALF_UP
四舍五入模式
6、ROUND_HALF_DOWN
五舍六入模式
7、ROUND_HALF_EVEN 银行家舍入法
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。
以下例子为保留小数点1位,那么这种舍入方式下的结果。
1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。