我是靠谱客的博主 等待吐司,最近开发中收集的这篇文章主要介绍BigDecimal类add等加减乘除后的值没有发生改变,那些我使用BigDecimal遇到的坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 类的方法的时候,要有一个对象接受返回值.

最后

以上就是等待吐司为你收集整理的BigDecimal类add等加减乘除后的值没有发生改变,那些我使用BigDecimal遇到的坑的全部内容,希望文章能够帮你解决BigDecimal类add等加减乘除后的值没有发生改变,那些我使用BigDecimal遇到的坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部