BigDecimal中除法divide()方法的详细解析,带你走进源码的world

进入方法源码之前,按照惯例,了解一下方法都需要知道哪些常量

//设置一个常量=0,判断用
public final static int ROUND_UP =           0;
//设置一个常量=7,判断用
public final static int ROUND_UNNECESSARY =  7;
//整型数字表示的BigDecimal,例a的intCompact值为122
private final transient long intCompact;
//Long类型的最小长度
static final long INFLATED = Long.MIN_VALUE;
//方法的第二个参数,指小数位位数
private final int scale;

以下是divde方法的方法体
BigDecimal中除法divide()方法的详细解析,带你走进源码的world_第1张图片

 public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
     
 		//如果第三个参数传过来的值小于0或者大于7,抛出异常"Invalid rounding mode"
        if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
            throw new IllegalArgumentException("Invalid rounding mode");
        //只要被除数不等于Long类型的最小值
        if (this.intCompact != INFLATED) {
     
        	//除数的值不等于Long类型最小值
            if ((divisor.intCompact != INFLATED)) {
     
            	//进入divide的方法
                return divide(this.intCompact, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
            } else {
     
            //除数的值等于Long类型最小值
                return divide(this.intCompact, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
            }
        } else {
     //被除数等于Long类型的最小值
        	//除数的值不等于Long类型最小值
            if ((divisor.intCompact != INFLATED)) {
     
                return divide(this.intVal, this.scale, divisor.intCompact, divisor.scale, scale, roundingMode);
            } else {
     //除数的值等于Long类型最小值
                return divide(this.intVal, this.scale, divisor.intVal, divisor.scale, scale, roundingMode);
            }
        }
    }

根据以上情况,势必会出现四种方法
被除数是long类型 除数是BigDecimal类型的
被除数是BigDecimal类型 除数是long类型的
被除数是long类型 除数是long类型的
被除数是BigDecimal类型 除数是BigDecimal类型的

总结

    (1)数字敏感计算使用BigDecimal。
    (2)尽量使用参数类型为String的构造函数。
    (3) BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

你可能感兴趣的:(java,后端,线性代数,大数据,算法)