BigDecimal类add等加减乘除后的值没有发生改变,那些我使用BigDecimal遇到的坑

在涉及金额计算时,通常使用BigDecimal避免精度损失。然而,在使用BigDecimal的add等方法时,若未正确接收返回值,可能导致计算结果无法更新。文章讲述了作者遇到的一个坑,即在执行add操作后,实际值并未改变。解决问题的关键在于,调用方法时需有一个对象接收返回的新值。

BigDecimal的使用场景

但凡我们的系统涉及到使用金额的时候,一般我们都会使用BigDecimal ,BigInteger等big类来进行计算,**不使用double,float类是因为浮点数都是会损失精度的,浮点数采用类似科学计数法的方式储存数据,**而BigDecimal类可以避免这个问题,它的底层是数组进行计算.

BigDecimal使用方法:

public static double sub(double v1,double v2){ 
//创建一个  BigDecimal 对象
BigDecimal b1 = new BigDecimal(Double.toString(v1));   
BigDecimal b2 = new BigDecimal(Double.toString(v2));  
//调用b1 对象的add方法. (传入的参数也必须是BigDecimal类型)
return b1.add(b2).doubleValue();   
}   

BigDecimal的基本加减乘除:

b1.subtract(b2)  -----减法
b1.multiply(b2)  ------乘法
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)    ----- 提供(相对)精确的除法运算。当发生除不尽
											的情况时,由scale参数指  定精度,以后的数字四舍五入
b.divide(one,scale,BigDecimal.ROUND_HALF_UP)   ---- 提供精确的小数位四舍五入处理

那么今天下午我使用BigDecimal遇到的一个大坑!!!

现在我说一下当时我的使用场景

//计算累计审定金额
//获得对象的集合
List<MySmallProjectCheckPricing> mySmallProjectCheckPricingList = getMySmallProjectCheckPricingListByContractId(entity.getContractId());
//设置一个总金额BigDecimal对象
BigDecimal countApproveMoney = BigDecimal.ZERO;
//遍历集合,获取每一个ApproveMoney值.然后加到总金额对象中
for (MySmallProjectCheckPricing mySmallProjectCheckPricing: mySmallProjectCheckPricingList
) {
//总金额加上ApproveMoney值
countApproveMoney.add(mySmallProjectCheckPricing.getApproveMoney());
}
//把总金额赋值给返回对象的一个属性.
entity.setCountApproveMoney(countApproveMoney);

然后我发现countApproveMoney总金额值无论怎么add,都是0,没有办法改变countApproveMoney的值,
这个问题困扰了我很久,最后点击add方法源码

    public BigDecimal add(BigDecimal augend) {
        if (this.intCompact != INFLATED) {
            if ((augend.intCompact != INFLATED)) {
                return add(this.intCompact, this.scale, augend.intCompact, augend.scale);
            } else {
                return add(this.intCompact, this.scale, augend.intVal, augend.scale);
            }
        } else {
            if ((augend.intCompact != INFLATED)) {
                return add(augend.intCompact, augend.scale, this.intVal, this.scale);
            } else {
                return add(this.intVal, this.scale, augend.intVal, augend.scale);
            }
        }
    }

发现源码return只是返回了计算结果,而没有把计算结果赋值给调用者(b1)!
这就好比 t.add(y) ,只是执行了 t+y 而没有把计算结果返回给 t.
下面是我修改完代码之后的结果

        List<MySmallProjectCheckPricing> mySmallProjectCheckPricingList = getMySmallProjectCheckPricingListByContractId(entity.getContractId());
        BigDecimal countApproveMoney = BigDecimal.ZERO;
        for (MySmallProjectCheckPricing mySmallProjectCheckPricing: mySmallProjectCheckPricingList
        ) {
            countApproveMoney  =  countApproveMoney.add(mySmallProjectCheckPricing.getApproveMoney());
        }
        entity.setCountApproveMoney(countApproveMoney);

所有我们在使用BigDecimal 类的方法的时候,要有一个对象接受返回值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值