我是靠谱客的博主 等待吐司,最近开发中收集的这篇文章主要介绍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遇到的坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复