在上半部分(一张图带你看透BigDecimal(上))我们对于BigDecimal的基本属性和构造函数有了清晰的认识,在已经知道如何构造一个BigDecimal的基础上我们再来看看如何更好的使用这个类吧。
算术运算
作为一个数值类型,算术运算是基本功能。相应的BigDecimal也提供了基本的算术运算如加减乘除,还有一些高级运算如指数运算pow、绝对值abs和取反negate等。我们重点分析比较常用的加减乘除和指数函数pow。
加法运算
在加法运算上BigDecimal提供了两个public的方法。
1, public BigDecimal add(BigDecimal augend)。
这个方法采用的逻辑比较简单,他遵循了我们对BigDecimal的最初认识,即只要搞定四个基本属性,这个对象就搞定了。所以在逻辑上的实现方式如下:result.intValue/intCompact = this.intValue/intCompact + augend. intValue/intCompact
result.scale = max(this.scale, augend.scale)
result.precision = 0
2, public BigDecimal add(BigDecimal augend, MathContext mc)
这个方法和上面的方法只相差一个MathContext参数,依照我们之前的经验,这个应该是在第一个方法的基础上加入了Rounding相关的操作。事实的确如此,唯一的差异是针对零值的情况加入了处理片段。
减法运算
BigDecimal对于减法同样提供了两个public的方法,对应于加法的两个方法。在处理逻辑上完全复用了加法的处理逻辑,针对减数进行了negate取负操作。public BigDecimal subtract(BigDecimal subtrahend, MathContext mc) {
if (mc.precision == 0)
return subtract(subtrahend);
// share the special rounding code in add()
return add(subtrahend.negate(), mc);
}
乘法运算
乘法运算和加法运算的思想保持一致,采用的逻辑为:result.intValue/intCompact = this.intValue/intCompact * multiplicand. intValue/intCompact
result.scale = sum(this.scale, multiplicand.scale)
result.precision = 0
在实际实现过程中提供了两类方法(之所以是两类,是因为存在参数不同的重载),分别为mutiply和multiplyAndRound。
除法运算
除法运算采用的逻辑为:
result.intValue/intCompact = this.intValue/intCompact 除以 divisor. intValue/intCompact
result.scale = this.scale - divisor.scale
BigDecimal的除法运算提供了5个的public方法,但是具体实现只有两个,接下来我们具体看一下这两个实现。
1, public BigDecimal divide(BigDecimal divisor)
这个方法在实际使用中并不多,因为这个方法要求满足整除的条件,如果不能整除则会抛出异常。MathContext mc = new MathContext( (int)Math.min(this.precision() +
(long)Math.ceil(10.0*divisor.precision()/3.0),
Integer.MAX_VAL