BigDecimal运算为什么不会丢失精度

以下分别对BigDecimal加减乘除运算执行过程描述:

加法(Addition)

当执行加法时,BigDecimal会自动对齐操作数的scale。假设我们有以下两个BigDecimal对象:

  • a = new BigDecimal("10.5") // scale is 1
  • b = new BigDecimal("2.345") // scale is 3

执行加法操作(a.add(b))时,内部过程如下:

  1. a的scale将被扩展以匹配b的scale,因此a变为10.500
  2. 然后对两个数的unscaled value执行加法操作:10500 + 2345
  3. 结果是12845,因为b的scale是3,结果的scale也是3,所以最终结果为12.845

减法(Subtraction)

减法操作类似于加法,在执行a.subtract(b)时,也会对齐scale:

  1. a的scale扩展为3,变为10.500
  2. 执行减法操作:10500 - 2345
  3. 结果是8155,因此最终结果的scale为3,数值为8.155

乘法(Multiplication)

乘法时,BigDecimal会简单地将两个操作数的unscaled values相乘,并将它们的scales相加,得到结果的scale。所以,a.multiply(b)的过程是:

  1. 直接相乘:105 * 2345
  2. 结果是246225a的scale为1,b的scale为3,所以结果的scale为1 + 3 = 4,得到最终结果24.6225

除法(Division)

除法是最复杂的,因为通常需要指定结果的scale以及舍入模式。假设我们执行a.divide(b, 5, RoundingMode.HALF_UP),过程如下:

  1. 首先,a除以b可能得到一个无限循环的小数,所以必须指定一个scale来确定结果的精度。
  2. 设置结果的scale为5,并且使用RoundingMode.HALF_UP舍入模式。
  3. 执行除法并根据需要舍入结果。

Java中,如果未指定舍入模式,而结果是无限循环小数的话,BigDecimal的除法操作将抛出ArithmeticException。通过设置scale和舍入模式,我们可以得到一个确定的结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值