BigDecimal的加减乘除及比较大小

本文介绍Java中BigDecimal类的使用方法,包括加、减、乘、除运算及数值大小的比较。通过具体示例展示了如何利用BigDecimal进行精确的算术运算,并提供了compareTo、min和max方法的源码解析。

 

    BigDecimal的加减乘除及比较大小

 

import java.math.BigDecimal;
import static java.lang.System.out;
public class BaseClass {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("100");  
        BigDecimal num2 = new BigDecimal("50");  
        
        //加法
        BigDecimal result1 = num1.add(num2);
        out.println("和    是   :  " + result1);
        
        //减法 
        BigDecimal result2 = num1.subtract(num2);
        out.println("差    是   :  " + result2);
        
        //乘法
        BigDecimal result3 = num1.multiply(num2);
        out.println("积    是   :  " + result3);
        
        //除法
        BigDecimal result4 = num1.divide(num2);
        out.println("商    是   :  " + result4);
        
        //比较
        BigDecimal num = new BigDecimal("100");     //用做比较的值  
        out.println(num1.compareTo(num2));            //大于 时,返回 1 
        out.println(num.compareTo(num1));            //等于 时,返回 0  
        out.println(num2.compareTo(num1));            //小于 时,返回 -1
        
        out.println(num1.min(num2));                //求两个数的最小值,返回小的数
        out.println(num1.max(num2));                //求两个数的最大值,返回大的数
        
//        compareTo方法比较时,不同于equals方法,需要两边都不为null,否则会报空指针异常,
//        源码如下
//        public int compareTo(BigDecimal val) {
//            // Quick path for equal scale and non-inflated case.
//            if (scale == val.scale) {
//                long xs = intCompact;
//                long ys = val.intCompact;
//                if (xs != INFLATED && ys != INFLATED)
//                    return xs != ys ? ((xs > ys) ? 1 : -1) : 0;
//            }
//            int xsign = this.signum();
//            int ysign = val.signum();
//            if (xsign != ysign)
//                return (xsign > ysign) ? 1 : -1;
//            if (xsign == 0)
//                return 0;
//            int cmp = compareMagnitude(val);
//            return (xsign > 0) ? cmp : -cmp;
//        }

//        max/min方法源代码如下
//        public BigDecimal max(BigDecimal val) {
//            return (compareTo(val) >= 0 ? this : val);
//        }
//        public BigDecimal min(BigDecimal val) {
//            return (compareTo(val) <= 0 ? this : val);
//        }
    }
}

 

 

BigDecimal加减乘除运算执行顺序与传统的数学运算不同,其运算顺序完全取决于方法调用的顺序。这意味着在使用 BigDecimal 进行连续的加减乘除操作时,运算的优先级不会按照数学中的乘除优先于加减来执行,而是按照代码中方法调用的顺序依次执行。 例如,以下代码: ```java BigDecimal result = one.divide(two).add(two).multiply(two).divide(new BigDecimal("3"), 2, BigDecimal.ROUND_DOWN); ``` 在执行时会按照以下步骤进行: 1. `one.divide(two)`:首先执行除法操作。 2. `.add(two)`:将上一步的结果与 `two` 相加。 3. `.multiply(two)`:将上一步的结果与 `two` 相乘。 4. `.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_DOWN)`:将上一步的结果除以 `3`,并保留两位小数,使用指定的舍入模式[^1]。 由于 BigDecimal 的运算顺序完全依赖于方法调用的顺序,因此在编写代码时需要特别注意运算的逻辑顺序,以确保结果符合预期。 ### BigDecimal 运算的注意事项 - **空值处理**:在进行 BigDecimal加减乘除比较大小等操作时,参与运算的两个值不能为空,否则会抛出 `java.lang.NullPointerException` 异常[^3]。 - **除法运算**:在进行除法运算时,被除数不能为 `0`,否则会抛出 `ArithmeticException` 异常[^3]。 - **舍入模式**:在进行除法运算时,必须指定保留的小数位数和舍入模式,以避免无限循环小数导致的异常。例如,使用 `BigDecimal.ROUND_HALF_UP` 表示四舍五入[^4]。 ### 示例代码 以下是一个完整的示例,展示了 BigDecimal加减乘除运算顺序及注意事项: ```java import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalExample { public static void main(String[] args) { BigDecimal one = new BigDecimal("1"); BigDecimal two = new BigDecimal("2"); BigDecimal three = new BigDecimal("3"); // 加法运算 BigDecimal addResult = one.add(two); System.out.println("加法结果: " + addResult); // 输出 3 // 除法运算 BigDecimal divideResult = one.divide(two, 2, RoundingMode.HALF_UP); System.out.println("除法结果: " + divideResult); // 输出 0.50 // 连续运算 BigDecimal complexResult = one.divide(two, 2, RoundingMode.HALF_UP) .add(two) .multiply(two) .divide(three, 2, RoundingMode.DOWN); System.out.println("复杂运算结果: " + complexResult); // 输出 1.66 } } ``` ### 总结 BigDecimal加减乘除运算顺序完全由方法调用的顺序决定,而不是依赖于传统的数学运算优先级。因此,在编写代码时,需要根据业务逻辑明确运算的顺序,并合理使用括号或分步计算来确保结果的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值