一个Java中BigDecimal的问题记录
题主今天在用 BigDecimal 进行计算的时候,遇到一个问题,那就是不管怎么计算,最后得到的值都没有变化,这里题主就有些疑惑了,用的也是推荐的API,先看代码:
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 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 rebateDetailVO : 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表示的数字的值是(unscaledValue×10 -scale )。
总结
到此这篇关于Java中一个BigDecimal问题的文章就介绍到这了,更多相关Java BigDecimal问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring ApplicationContextAware 接口的作用及使用方式
Spring提供了许多回调接口,用于Bean生命周期中执行特定的操作,通过实现ApplicationContextAware接口,Spring提供了一种便捷的方式让 Bean获取对Spring容器的引用,本文介绍ApplicationContextAware接口的作用、使用方式,以及在实际应用中的常见场景,感兴趣的朋友一起看看吧2024-01-01Java计算一个数加上100是完全平方数,加上168还是完全平方数
这篇文章主要介绍了Java计算一个数加上100是完全平方数,加上168还是完全平方数,需要的朋友可以参考下2017-02-02Kotlin + Retrofit + RxJava简单封装使用详解
这篇文章主要介绍了Kotlin + Retrofit + RxJava简单封装使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-07
最新评论