项目|金额场景计算&BigDecimal使用简记

这篇具有很好参考价值的文章主要介绍了项目|金额场景计算&BigDecimal使用简记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        在实际项目开发中,我们经常会遇到一些金额计算,分摊等问题,通常我们都使用java.math.BigDecimal 来完成各种计算,避免使用浮点数float,double来计算金额,以免丢失精度,以下是博主部分使用场景和使用BigDecimal简记分享。。

案例1:统计各年龄段,用户存款:实现集合的所有金额相加,结果保留两位小数

        在平常项目中,我们经常会遇到查询某个集合,在集合下计算所有价钱的总和

 public static void main(String[] args) {
        //无论如何都会出现两位小数 java.math.BigDecimal.ROUND_HALF_UP
        List<User> userList = new ArrayStack();
        userList.add(new User().setAge(30).setMoney(new BigDecimal("145")).setUsername("dzx"));
        userList.add(new User().setAge(10).setMoney(new BigDecimal("143")).setUsername("dzx"));
        userList.add(new User().setAge(10).setMoney(new BigDecimal("144")).setUsername("dzx"));
        userList.add(new User().setAge(10).setMoney(new BigDecimal("142")).setUsername("dzx"));
        System.out.println(userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add).setScale(2, ROUND_HALF_UP));
    }

        此处我们使用了stream的处理方式,更简洁的计算了总和,设置精度为2,和四舍五入,关于ROUND_HALF_UP的其他取值,可以参考java.math.BigDecimal.ROUND_HALF_UP静态方法里的取值,共有0-7序号的8种取值,经常使用ROUND_HALF_UP=4(四舍五入)、ROUND_HALF_DOWN=5(五舍六入)、ROUND_FLOOR=3(向下取整)、ROUND_CEILING=2(向上取整)

案例2:用户下单谋些商品,商品购买的支付金额不准确(包含了各种优惠),需要重新分摊计算每件商品金额,分摊的算法就是通过每件商品的支付金额占比,计算出具体每件商品的实付金额

        通常我们需要分摊,总会出现除不尽,或者精度问题,为此我们要保证总的数不能少,为了减少精度等问题,就要采用最后一件做减法的方式,这样就能保证最后分摊金额的准确性。以图中为例,用户下单购买了三件商品,订单总实付为100.1,支付为233,由于各种原因(平台各种优惠,银行满减,红包等活动)经常导致支付金额与实付金额不等,那么就要重新计算各商品的实付金额

项目|金额场景计算&BigDecimal使用简记,开发语言

ps:图中计算结果都为四舍五入,保留小数两位,计算器计算的结果,非程序

        三件商品,其中商品1:支付3,那么就需要计算她的实付金额,首先需要计算这件商品原支付金额的占比,再通过这个比例计算实付金额,商品2同理,到商品3则要采用最后一件做减法的方式,否则会造成总的实付金额会不等的情况。具体计算以商品1为例,实付金额为:3/233*100.1=1.29,按照这样的逻辑编写代码

     public static void main(String[] args) {
        //先除再乘
        BigDecimal result1 = new BigDecimal("3")
                .divide(new BigDecimal("233"),2,ROUND_HALF_UP)
                .multiply(new BigDecimal("100.1")).setScale(2,ROUND_HALF_UP);
        System.out.println("先除再乘,输出:"+result1);
    }
先除再乘,输出:1.00

        我们会发现程序实际计算结果,和程序计算结果有偏差,中间的偏差是哪里来的呢?答案是除法来的,我们在平常计算的时候,除以200的时候已经做了精度处理,因为我们不可能算的尽,因此我们的做法都是先乘后除,乘法为什么就不会有这个问题,因为乘法通常都是有限的数,非无穷的数,我们乘法可以避免进度丢失,因此我们实际计算的时候,需要调整计算公式,由3/233*100.1调整为3*100.1/200,具体代码如下:

      public static void main(String[] args) {
        //先乘再除
        BigDecimal result2 = new BigDecimal("3")
                .multiply(new BigDecimal("100.1"))
                .divide(new BigDecimal("233"),2,ROUND_HALF_UP).setScale(2,ROUND_HALF_UP);
        System.out.println("先乘再除,输出:"+result2);
    }
先乘再除,输出:1.29

        这样我们会避免了除法除不尽带来的精度丢失问题,实际结果应该为1.29

        总结

         1.金额计算中,避免先除后乘精度丢失,应先乘后除

         2.金额分摊中,应该使用最后一件用减法的方式,分摊文章来源地址https://www.toymoban.com/news/detail-717620.html

到了这里,关于项目|金额场景计算&BigDecimal使用简记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java进行数字计算 BigDecimal计算(加减乘除)

    Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四

    2023年04月08日
    浏览(29)
  • 国内项目国际化后金额处理方案

      目标 : 已有的国内项目,需要部署国际化。需要考虑币种、金额货币精度、多语言、汇率、税等一系列问题。这里主要说的就是其中金额精度的处理。 现状 : 日常国内项目里,界面输入的金额是元,然后数据库存储以及与其他系统交互都是用的分,也是就固定的货币精

    2024年02月05日
    浏览(53)
  • Java 数学计算(一):BigDecimal 详解 + 代码示例

    ❤️ 个人主页:水滴技术 🌸 订阅专栏:Java 教程:从入门到精通 🚀 支持水滴: 点赞 👍 + 收藏 ⭐ + 留言 💬 大家好,我是水滴~~ 本文主要对 BigDecimal 类进行详细介绍,主要内容有:构造器、静态方法、静态常量、常用方法、舍入模式,并提供了大量的代码示例,可以将该

    2023年04月08日
    浏览(28)
  • 项目开发中什么场景下Redis适用?

    Redis是一种开源的内存键值存储系统,具有高性能、高可靠、持久化、可扩展等特点,因此在许多场景下都非常适用。 缓存场景 数据库查询缓存:在Web应用中,频繁的数据库查询是一项昂贵的操作,会消耗大量的计算资源和时间。使用Redis作为数据库查询的缓存层,可以将查

    2024年01月21日
    浏览(29)
  • 流量阶梯 用量按照日、月、年、自然月、自然年,周期叠加分段计算各个阶梯金额

    周期时长、周期单位、叠加次数 商品 周期时长 周期单位 叠加次数 A 4 月 2 B 1 月 6 用量大于0GB, 流量总价30元 用量大于90GB, 流量单价0.19元/GB 用量大于100GB, 流量单价0.12元/GB B商品 1月 2月 3月 4月 5月 6月 7月 8月 9月 用量 10KB 50KB 90KB 91KB 101KB 102KB 0 30元 30元 30元 30元 30元 30元 90

    2024年04月29日
    浏览(27)
  • 项目终于上了这个数据单位转换工具类,金额转换太优雅了!

    来源:blog.csdn.net/qq_35387940/article/details/129167329 平时做一些统计数据,经常从数据库或者是从接口获取出来的数据,单位是跟业务需求不一致的。 比如, 我们拿出来的 分, 实际上要是元 又比如,我们拿到的数据需要 乘以100 返回给前端做 百分比展示 又比如, 千分比转换 又

    2024年02月10日
    浏览(25)
  • 机器学习、深度学习项目开发业务数据场景梳理汇总记录二

    本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理,文章会随着项目的开发推进不断更新。  这里是续文,因为CSDN单篇文章内容太大的话就会崩溃的,别问我怎么知道的,问就是血泪教训,辛辛苦苦写了一天的东西就那么一刹那崩溃就没了。。。

    2024年02月13日
    浏览(31)
  • java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题

    java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题 java中BigDecimal的介绍及使用(二) BigDecimal是Java在java.math包中提供的 线程安全 的API类。BigDecimal是Java中用于表示任意精度数字的类,它可以表示无限长度的小数, BigDecimal 通常支持任意位数的小数部分 ,用来对超过

    2024年02月16日
    浏览(27)
  • 【Unity】VR基础开发2项目准备-VR基本场景构建(OpenXR方向)

    稍等一会儿,编辑器界面就出现了。有可能你的界面布局会有所不同,可以在右上角点击布局,选择Tall,布局切换后在来到左边窗口的左上角,将Game选项卡拖放到下方Dock,这样就可以得到和我一样的布局了。 简单介绍一下。 场景面板是对游戏进行可视化编辑的地方。 Hie

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包