以下分别对BigDecimal加减乘除运算执行过程描述:
加法(Addition)
当执行加法时,BigDecimal
会自动对齐操作数的scale。假设我们有以下两个BigDecimal
对象:
a = new BigDecimal("10.5")
// scale is 1b = new BigDecimal("2.345")
// scale is 3
执行加法操作(a.add(b)
)时,内部过程如下:
a
的scale将被扩展以匹配b
的scale,因此a
变为10.500
。- 然后对两个数的unscaled value执行加法操作:
10500 + 2345
。 - 结果是
12845
,因为b
的scale是3,结果的scale也是3,所以最终结果为12.845
。
减法(Subtraction)
减法操作类似于加法,在执行a.subtract(b)
时,也会对齐scale:
a
的scale扩展为3,变为10.500
。- 执行减法操作:
10500 - 2345
。 - 结果是
8155
,因此最终结果的scale为3,数值为8.155
。
乘法(Multiplication)
乘法时,BigDecimal
会简单地将两个操作数的unscaled values相乘,并将它们的scales相加,得到结果的scale。所以,a.multiply(b)
的过程是:
- 直接相乘:
105 * 2345
。 - 结果是
246225
,a
的scale为1,b
的scale为3,所以结果的scale为1 + 3 = 4
,得到最终结果24.6225
。
除法(Division)
除法是最复杂的,因为通常需要指定结果的scale以及舍入模式。假设我们执行a.divide(b, 5, RoundingMode.HALF_UP)
,过程如下:
- 首先,
a
除以b
可能得到一个无限循环的小数,所以必须指定一个scale来确定结果的精度。 - 设置结果的scale为5,并且使用
RoundingMode.HALF_UP
舍入模式。 - 执行除法并根据需要舍入结果。
Java中,如果未指定舍入模式,而结果是无限循环小数的话,BigDecimal
的除法操作将抛出ArithmeticException
。通过设置scale和舍入模式,我们可以得到一个确定的结果。