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。

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