一个Java中BigDecimal的问题记录

 更新时间:2021年11月25日 10:08:58   作者:爱编程的小鱼  
这篇文章主要给大家介绍了关于Java中一个BigDecimal问题的相关资料,通过文中介绍的方法可以很方便的解决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问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 创建动态类和查看方法列表信息的实例

    Java 创建动态类和查看方法列表信息的实例

    这篇文章主要介绍了 Java 创建动态类和查看方法列表信息的实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java实现常用加密算法SM3的方式及测试代码

    Java实现常用加密算法SM3的方式及测试代码

    这篇文章介绍了SM3算法在Java中的实现方式,SM3算法是一种密码散列函数标准,主要用于商用密码应用中的数字签名和验证、消息认证码生成和验证、随机数生成等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Spring AI聊天功能开发步骤

    Spring AI聊天功能开发步骤

    本文给大家介绍Spring AI聊天功能开发步骤,首先引入依赖,继承父版本的springboot依赖,最好是比较新的依赖,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • SpringMVC教程之文件上传与下载详解

    SpringMVC教程之文件上传与下载详解

    本文将对使用MultipartResolver处理文件上传的步骤,两种文件下载方式(直接向response的输出流中写入对应的文件流、使用 ResponseEntity<byte[]>来向前端返回文件)等进行详尽介绍,需要的可以参考一下
    2022-12-12
  • Java开发实现猜拳游戏

    Java开发实现猜拳游戏

    这篇文章主要为大家详细介绍了Java实现猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Java实现2048小游戏(可直接运行)

    Java实现2048小游戏(可直接运行)

    这篇文章主要给大家介绍了关于Java实现2048小游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Elasticsearch模糊查询详细介绍

    Elasticsearch模糊查询详细介绍

    这篇文章主要给大家介绍了关于Elasticsearch模糊查询的相关资料,在数据库查询中模糊查询是一种强大的技术,可以用来搜索与指定模式匹配的数据,需要的朋友可以参考下
    2023-09-09
  • 平衡二叉树的左右旋以及双旋转的图文详解

    平衡二叉树的左右旋以及双旋转的图文详解

    今天小编就为大家分享一篇关于平衡二叉树的左右旋以及双旋转的图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java使用kafka发送和生产消息的示例

    Java使用kafka发送和生产消息的示例

    本篇文章主要介绍了Java使用kafka发送和生产消息的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Mybatis优化检索的方法详解

    Mybatis优化检索的方法详解

    MyBatis是一款优秀的基于Java的持久层框架,它可以将 SQL 语句和数据库中的记录映射成为 Java 对象,并且支持灵活的 SQL 查询语句,在Mybatis中,可以使用动态SQL来灵活构造SQL语句,从而满足各种不同的检索需求,本文介绍Mybatis如何优化检索,需要的朋友可以参考下
    2024-05-05

最新评论