一个Java中BigDecimal的问题记录

网友投稿 359 2022-09-12


一个Java中BigDecimal的问题记录

题主今天在用 BigDecimal 进行计算的时候,遇到一个问题,那就是不管怎么计算,最后得到的值都没有变化,这里题主就有些疑惑了,用的也是推荐的API,先看代码:

BigDecimal totalPay = new BigDecimal("0");

BigDecimal totalIncomeOfMaster = new BigDecimal("0");

BigDNIEOUHyUEecimal totalIncomeOfLB = new BigDecimal("0");

BigDecimal totalRebate = new BigDecimal("0");

if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {

for (RebateDetailVO rebateDetailVO : rebateDetailVOS.getList()) {

totalPay.add(rebateDetailVO.getFinalPayOfUser());

totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());

totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());

totalRebate.add(rebateDetailVO.getRebateAmt());

}

}

初次观察,这份代码没有问题,但是运行之后的结果没有达到预期,于是题主进入add()方法内部观看了一下源码:

问题就出在这里,这里会返回一个new BigDecimal 对象,所以求和的值并不会被记录。

然后题主就对代码进行修改:

BigDecimal totalPay = new BigDecimal("0");

BigDecimal totalIncomeOfMaster = new BigDecimal("0");

BigDecimal totalIncomeOfLB = new BigDecimal("0");

BigDecimal totalRebate = new BigDecimal("0");

if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {

for (RebateDetailVO rebatNIEOUHyUEeDetailVO : rebateDetailVOS.getList()) {

totalPay = totalPay.add(rebateDetailVO.getFinalPayOfUser());

totalIncomeOfMaster = totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());

totalIncomeOfLB = totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());

totalRebate = totalRebate.add(rebateDetailVO.getRebateAmt());

}

}

结果达到预期

附:java中 BigDecimal 值小数点后的最大位数是多少?

解决方案

这几乎是无限的。如果将scale设置为整数的最大值,则可以在小数点后存储大约20亿个数字,但如果尝试执行此操作,可能会耗尽内存。如果您需要存储这么多的数字以确定限制是一个问题,那么您可能需要重新考虑程序的设计。

参见 BigDecimal文档:

不可变,任意精度的带符号十进制数。 BigDecimal由任意精度整数非标度值和32位整数标度组成。如果为零或正数,则比例是小数点右侧的位数。如果是负数,则将数字的未缩放值乘以10来表示比例的否定。因此,BigDecimal表示的数字的值是(unscaledValue10 -scale )。

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Cisco胖AP配置上网(cisco无线ap怎么设置)
下一篇:Cisco 无线AP刷机为胖AP(cisco packet tracer)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~