分享BigDecimal金额计算的4种方式

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

基本介绍

金额计算这块通常都是基于2位小数的四舍五入,如果是自己的系统内部功能金额位数一般都是固定的,在正常的加减乘除运算逻辑都是保留同样位数的,但是乘法和除法相对比较特殊,在计算小数的部分可能会计算出更多位数的小数点,如若需要将计算后的金额数据与某个值进行对比时,就需要考虑数据部分的完全相等了,在应对此种情况的数据逻辑时常见的有两种,第一种是两个数值相见,取绝对值的误差阈值,若在允许的阈值范围内(比如两个数值都是最多2位小数,阈值设置为0.0001),则认为它们是相等的;第二种则是需要知晓该金额在计算过程中所使用的计算方式,采用统一的计算方式计算得出同样的结果即可。

去年实现的一个功能中正好就使用到了多种小数位数的计算方式,大概是4种:四舍五入、截位法、四舍六入五成双、正舍负入(实际还有更多种),这些数据的计算都可以有相关的代码计算方式得出,本次主要分享Math和BigDecimal,参考如下:

Math

@RunWith(JUnit4.class)
public class CalculateMathTest {

    /**
     * 保留2位小数,四舍五入
     */
    @Test
    public void round() {
        System.out.println(Math.round(12345.554 * 100) / 100D);
        System.out.println(Math.round(12345.555 * 100) / 100D);
        System.out.println(Math.round(12345.556 * 100) / 100D);
    }

    /**
     * 保留2位小数,正舍负入(ceil:反过来,正入负舍)
     */
    @Test
    public void floor() {
        System.out.println(Math.floor(123.554 * 100) / 100D);
        System.out.println(Math.floor(123.555 * 100) / 100D);
        System.out.println(Math.floor(123.556 * 100) / 100D);

        System.out.println(Math.floor(-123.554 * 100) / 100D);
        System.out.println(Math.floor(-123.555 * 100) / 100D);
        System.out.println(Math.floor(-123.556 * 100) / 100D);
    }

}

尝试着写了点小demo,发现Math这个数学函数类提供的API重点并不在于金额的计算上,所以找到的金额计算API比较少,在金额计算这块比较鸡肋(先乘以100再除以100得到带小数位数的金额),也算是满足了本次4种金额计算方式中的两种了。

BigDecimal

/**
 * 保留2位小数,四舍五入
 */
@Test
public void round() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_HALF_UP));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_HALF_UP));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_HALF_UP));
}
/**
 * 保留2位小数,正舍负入
 */
@Test
public void floor() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println();
    System.out.println(new BigDecimal("-12345.554").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("-12345.555").setScale(2, BigDecimal.ROUND_FLOOR));
    System.out.println(new BigDecimal("-12345.556").setScale(2, BigDecimal.ROUND_FLOOR));
}
/**
 * 保留2位小数,截位法
 */
@Test
public void down() {
    System.out.println(new BigDecimal("12345.554").setScale(2, BigDecimal.ROUND_DOWN));
    System.out.println(new BigDecimal("12345.555").setScale(2, BigDecimal.ROUND_DOWN));
    System.out.println(new BigDecimal("12345.556").setScale(2, BigDecimal.ROUND_DOWN));
}
/**
 * 保留2位小数,四舍六入五成双
 */
@Test
public void even() {
    System.out.println(new BigDecimal("12345.234").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.236").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.235").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.245").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println();
    System.out.println(new BigDecimal("12345.2450").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2451").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2452").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2453").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2454").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2455").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2456").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2457").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2458").setScale(2, BigDecimal.ROUND_HALF_EVEN));
    System.out.println(new BigDecimal("12345.2459").setScale(2, BigDecimal.ROUND_HALF_EVEN));
}

其它说明

BigDecimal中提供了多种金额计算的方法,在RoundingMode类中也单独声明(封装)了一些运算规则的实现,四舍六入五成双又称银行间算法,如果跨界了还是不太容易理解的,本次实践呢又拿出来了多个示例输出来理解,所以我整理的知识点为:

(1)保留两位小数,所以至少应该精确到3位小数,根据第三位小数的值来判断如何第2位小数位来进位;

(2)小数点第3位如果是4则舍去,如果是6则进1;

(3)小数点第3位如果是5,且无第4位小数,则观察第2位小数,若为基数则进1,若为偶数则舍去;

(4)小数点第3位如果是5,且存在第4位小数,则观察第4位小数,若为0则舍去,否则则进1;

所以,这里的四舍六入五成双的输出结果为:

分享BigDecimal金额计算的4种方式

分享BigDecimal金额计算的4种方式欢迎来到陈冬冬的个人经验分享平台https://www.chendd.cn/blog/article/1649745859662635010.html 文章来源地址https://www.toymoban.com/news/detail-421993.html

到了这里,关于分享BigDecimal金额计算的4种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题

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

    2024年02月16日
    浏览(38)
  • Gti的基本介绍和使用方式

    Git 是一种分布式版本控制系统, 主要用于管理软件开发过程中的代码变更。其基本概念包括: 仓库 (Repository): Git中存储代码的基本单位,即一个代码库。在仓库中可以存储多个分支、标签、提交记录等。 分支 (Branch): Git中的分支是代码的不同开发方向,开发人员可以在不影响

    2024年02月11日
    浏览(36)
  • 分享 | 软件测试的基本流程是什么?软件测试流程详细介绍

    软件测试和软件开发一样,是一个比较复杂的工作过程,如果无章法可循,随意进行测试势必会造成测试工作的混乱。为了使测试工作标准化、规范化,并且快速、高效、高质量地完成测试工作,需要制订完整且具体的测试流程。 不同类型的软件产品测试的方式和重点不一样

    2024年02月05日
    浏览(50)
  • Streamlit库入门级教程(一)——基本介绍和使用方式

    最近做比赛了解到了Streamlit这个库,花了几天时间浅浅入门了一下,官网虽有完整的API文档等教程,但是纯英文版的,阅读起来有些许费力,在这里想以自己的逻辑用中文简单复刻一些入门级内容,方便 小白 使用(大佬看见轻喷)~ Streamlit库官方地址:https://streamlit.io/ API文

    2023年04月20日
    浏览(56)
  • BigDecimal常用计算

     

    2024年02月01日
    浏览(30)
  • Java进行数字计算 BigDecimal计算(加减乘除)

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

    2023年04月08日
    浏览(40)
  • Matlab 使用经验分享(常用函数介绍;矩阵常见计算)

    大家好!最近有很多朋友询问我关于 Matlab 的使用,于是我决定写一篇博客来分享一下我的经验。对于数学和编程爱好者来说,Matlab 是一个非常有用的工具。我自己在数学实验和数学建模竞赛中也经常使用它。那么,为什么 Matlab 这么受欢迎呢? MATLAB 是美国MathWorks 公司自2

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

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

    2023年04月08日
    浏览(42)
  • 流量阶梯 用量按照日、月、年、自然月、自然年,周期叠加分段计算各个阶梯金额

    周期时长、周期单位、叠加次数 商品 周期时长 周期单位 叠加次数 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日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包