BigDecimal 8种保留小数的RoundingMode

BigDecimal通常可以用来金额保存计算,经常遇到保留小数位的问题。
通过调用setScale(int newScale, int roundingMode)传入保留小数位,舍入模式两个参数获取新的BigDecimal。
源码是总共有8种,按源码传入的参数对应int值分为0-7,简单记忆0-5可以分成两两对应,6是向两端最近靠近,7是不符合精确就抛出异常。以下介绍8种roundingMode的用法:
在这里插入图片描述
在这里插入图片描述

0.BigDecimal.ROUND_UP

保留X位,X位始终进位,无论X位后是多大。如:3.1411保留3位,则为3.142。

        System.out.println("-----BigDecimal.ROUND_UP-----");
        //保留3位,第3位始终进位  3.1411-》3.142
        BigDecimal roundUp = new BigDecimal("3.1411");
        roundUp = roundUp.setScale(3, BigDecimal.ROUND_UP);
        System.out.println("3.1411===>"+roundUp);

在这里插入图片描述

1.BigDecimal.ROUND_DOWN

保留X位,直接丢弃X位后面的。如:3.1415保留3位,则为3.141

        System.out.println("-----BigDecimal.ROUND_DOWN-----");
        //保留3位,直接丢弃后面的 3.1415-》3.141
        BigDecimal roundDown = new BigDecimal("3.1415");
        roundDown = roundDown.setScale(3, BigDecimal.ROUND_DOWN);
        System.out.println("3.1415===>"+roundDown);

在这里插入图片描述

2.BigDecimal.ROUND_CEILING

保留X位,向变大靠近。正数,则X位进位。负数,则X位不变,丢弃X后的位数。如:3.1415保留3位,则为3.142。-3.1415保留3位,则为-3.141。

        //接近正无穷大的舍入(变大)
        System.out.println("-----BigDecimal.ROUND_CEILING-----");
        //保留3位,往正靠近 3.1415->3.142
        BigDecimal roundCEILING = new BigDecimal("3.1415");
        roundCEILING = roundCEILING.setScale(3, BigDecimal.ROUND_CEILING);
        System.out.println("3.1415===>"+roundCEILING);
        roundCEILING = new BigDecimal("-3.1415");
        roundCEILING = roundCEILING.setScale(3, BigDecimal.ROUND_CEILING);
        System.out.println("-3.1415===>"+roundCEILING);

在这里插入图片描述

3.BigDecimal.ROUND_FLOOR

保留X位,向变小靠近。负数,则X位进位。正数,则X位不变,丢弃X后的位数。如:3.1415保留3位,则为3.141。-3.1415保留3位,则为-3.142。

        //接近负无穷大的舍入(变小)
        System.out.println("-----BigDecimal.ROUND_FLOOR-----");
        //保留3位,往负靠近 3.1415->3.141
        BigDecimal roundFLOOR = new BigDecimal("-3.1415");
        roundFLOOR = roundFLOOR.setScale(3, BigDecimal.ROUND_FLOOR);
        System.out.println("-3.1415===>"+roundFLOOR);
        roundFLOOR = new BigDecimal("3.1415");
        roundFLOOR = roundFLOOR.setScale(3, BigDecimal.ROUND_FLOOR);
        System.out.println("3.1415===>"+roundFLOOR);

在这里插入图片描述

4.BigDecimal.ROUND_HALF_UP

保留X位,根据后一位四舍五入。如:3.1414保留3位,结果为3.141.。3.1415保留3位,结果为3.142。

        System.out.println("-----BigDecimal.ROUND_HALF_UP-----");
        //保留3位,根据后一位四舍五入
        BigDecimal roundHALFUP = new BigDecimal("3.1415");
        roundHALFUP = roundHALFUP.setScale(3, BigDecimal.ROUND_HALF_UP);
        System.out.println("3.1415===>"+roundHALFUP);

在这里插入图片描述

5.BigDecimal.ROUND_HALF_DOWN

保留X位,根据后一位五舍六入。如3.1415保留3位,结果为3.1416。3.1416保留3位,结果为3.142。

        System.out.println("-----BigDecimal.ROUND_HALF_DOWN-----");
        //保留3位,根据后一位五舍六入
        BigDecimal roundHALFDOWN = new BigDecimal("3.1415");
        roundHALFDOWN = roundHALFDOWN.setScale(3, BigDecimal.ROUND_HALF_DOWN);
        System.out.println("3.1415===>"+roundHALFDOWN);
        roundHALFDOWN = new BigDecimal("3.1416");
        roundHALFDOWN = roundHALFDOWN.setScale(3, BigDecimal.ROUND_HALF_DOWN);
        System.out.println("3.1416===>"+roundHALFDOWN);

在这里插入图片描述

6.BigDecimal.ROUND_HALF_EVEN

保留X位,向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如3.1413保留3位,3.141和3.142距离最近的是3.141,结果3.141。

        //向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
        System.out.println("-----BigDecimal.ROUND_HALF_EVEN-----");
        BigDecimal roundHALFEVEN = new BigDecimal("3.1413");
        roundHALFEVEN = roundHALFEVEN.setScale(3, BigDecimal.ROUND_HALF_EVEN);
        System.out.println("3.1413===>"+roundHALFEVEN);
        roundHALFEVEN = new BigDecimal("3.1415");
        roundHALFEVEN = roundHALFEVEN.setScale(3, BigDecimal.ROUND_HALF_EVEN);
        System.out.println("3.1415===>"+roundHALFEVEN);

在这里插入图片描述

7.BigDecimal.ROUND_UNNECESSARY

计算结果必须是精确的,不需要舍入的,否则抛出 ArithmeticException。如3.141保留3位符合,结果为3.141。3.14保留3位,不够补零,结果为3.140。3.1415超出位数,则抛出异常ArithmeticException。

        System.out.println("-----BigDecimal.ROUND_UNNECESSARY-----");
        BigDecimal unnecessary = new BigDecimal("3.141");
        unnecessary = unnecessary.setScale(3, BigDecimal.ROUND_UNNECESSARY);
        System.out.println("3.141===>"+unnecessary);
        unnecessary = new BigDecimal("3.1415");
        unnecessary = unnecessary.setScale(3, BigDecimal.ROUND_UNNECESSARY);
        System.out.println(unnecessary);

在这里插入图片描述

不指定rounding

传入一个参数保留X小数,不传入舍入模式,默认用的ROUND_UNNECESSARY。

        System.out.println("-----不指定rounding-----");
        BigDecimal bigDecimal = new BigDecimal("3.1415");
        bigDecimal = bigDecimal.setScale(3);
        System.out.println(bigDecimal);

在这里插入图片描述

总结

8种保留小数位的方法如果不熟悉,可以按照 以下对应关系来熟悉使用。

ROUND_UP 进位 《====》ROUND_DOWN 丢弃
ROUND_CEILING 变大《====》ROUND_FLOOR 变小
ROUND_HALF_UP 四舍五入《====》ROUND_HALF_DOWN 五舍六入
ROUND_HALF_EVEN 向最近的靠近
ROUND_UNNECESSARY 不精确抛出异常
  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值