本文主要是介绍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方法的方法体
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()方法的详细解析,带你走进源码的world的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!