进入方法源码之前,按照惯例,了解一下方法都需要知道哪些常量
//设置一个常量=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方法的方法体

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)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
本文详细解析了BigDecimal的divide方法,介绍了在不同数据类型组合下的除法运算,并探讨了方法源码中的关键常量。通过文章,读者可以深入了解BigDecimal的精度控制及其在大数据计算中的重要性。
4013

被折叠的 条评论
为什么被折叠?



