一、四則運算
// 測試四則運算
@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。