BigDecimal四則運算和精度計算

一、四則運算

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章