java 算术取舍RoundingMode

在使用算数运算的时候,我们经常会涉及到取舍问题,下面介绍一下RoundingMode对应的各种取舍方法

  • 一:RoundingMode.HALF_UP 这是我们最熟悉的四舍五入
	    String a="100";
        String b="3";
        String c="6";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.HALF_UP);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.HALF_UP);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
         //控制台输出结果
//        取舍之后的结果1:---》33.33
//        取舍之后的结果2:---》16.67
  • 二:RoundingMode.HALF_DOWN 这是五舍六入模式,不常见。
        String a="100";
        String b="6";
        String c="4000";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.HALF_DOWN);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.HALF_DOWN);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
        //控制台输出结果
//        取舍之后的结果1:---》16.67
//        取舍之后的结果2:---》0.02
  • 三:RoundingMode.UP 若舍入位为非零,则对舍入部分的前一位数字加1;若舍入位为零,则直接舍弃。即为向外取整模式
        String a="100";
        String b="100";
        String c="4000";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.UP);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.UP);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
        //控制台输出结果
//        取舍之后的结果1:---》1.00
//        取舍之后的结果2:---》0.03
  • 四:RoundingMode.DOWN 不论舍入位是否为零,都直接舍弃。即为向内取整模式
        String a="100";
        String b="6";
        String c="4000";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.DOWN);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.DOWN);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
        //控制台输出结果
//        取舍之后的结果1:---》16.66
//        取舍之后的结果2:---》0.02
  • 五:RoundingMode.CEILING 若 BigDecimal 为正,则舍入行为与 RoundingMode.UP相同;若为负,则舍入行为与 RoundingMode.DOWN 相同。即为向上取整模式。
        String a="-100";
        String b="6";
        String c="4000";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.CEILING);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.CEILING);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
        //控制台输出结果
//        取舍之后的结果1:---》-16.66
//        取舍之后的结果2:---》-0.02
  • 六:RoundingMode.FLOOR 若 BigDecimal 为正,则舍入行为与 RoundingMode.DOWN 相同;若为负,则舍入行为与 RoundingMode.UP 相同。即为向下取整模式。
        String a="-100";
        String b="6";
        String c="4000";
        BigDecimal bigDecimal_a=new BigDecimal(a);
        BigDecimal bigDecimal_b=new BigDecimal(b);
        BigDecimal bigDecimal_c=new BigDecimal(c);
        BigDecimal bigDecimal_res1=bigDecimal_a.divide(bigDecimal_b,2, RoundingMode.FLOOR);
        BigDecimal bigDecimal_res2=bigDecimal_a.divide(bigDecimal_c,2, RoundingMode.FLOOR);
        System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
        System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
        //控制台输出结果
//        取舍之后的结果1:---》-16.67
//        取舍之后的结果2:---》-0.03
  • 七:RoundingMode.HALF_EVEN 银行家舍入模式
    • 若(舍入位大于5)或者(舍入位等于5且前一位为奇数),则对舍入部分的前一位数字加1;
    • 若(舍入位小于5)或者(舍入位等于5且前一位为偶数),则直接舍弃。
    • 和正负无关,见下面代码示例:
       String a="1";
       String b="55.555";
       String c="55.545";
       BigDecimal bigDecimal_a=new BigDecimal(a);
       BigDecimal bigDecimal_b=new BigDecimal(b);
       BigDecimal bigDecimal_c=new BigDecimal(c);
       BigDecimal bigDecimal_res1=bigDecimal_b.divide(bigDecimal_a,2, RoundingMode.HALF_EVEN);
       BigDecimal bigDecimal_res2=bigDecimal_c.divide(bigDecimal_a,2, RoundingMode.HALF_EVEN);
       System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
       System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
       //控制台输出结果
//        取舍之后的结果1:---》55.56
//        取舍之后的结果2:---》55.54
       String a="-1";
       String b="55.555";
       String c="55.545";
       BigDecimal bigDecimal_a=new BigDecimal(a);
       BigDecimal bigDecimal_b=new BigDecimal(b);
       BigDecimal bigDecimal_c=new BigDecimal(c);
       BigDecimal bigDecimal_res1=bigDecimal_b.divide(bigDecimal_a,2, RoundingMode.HALF_EVEN);
       BigDecimal bigDecimal_res2=bigDecimal_c.divide(bigDecimal_a,2, RoundingMode.HALF_EVEN);
       System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
       System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
       //控制台输出结果
//        取舍之后的结果1:---》-55.56
//        取舍之后的结果2:---》-55.54
  • 八:RoundingMode.UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。如果有涉及到取舍精度的情况,则抛出ArithmeticException。
       String a="-1";
       String b="55.555";
       String c="55.545";
       BigDecimal bigDecimal_a=new BigDecimal(a);
       BigDecimal bigDecimal_b=new BigDecimal(b);
       BigDecimal bigDecimal_c=new BigDecimal(c);
       BigDecimal bigDecimal_res1=bigDecimal_b.divide(bigDecimal_a,3, RoundingMode.UNNECESSARY);
       BigDecimal bigDecimal_res2=bigDecimal_c.divide(bigDecimal_a,3, RoundingMode.UNNECESSARY);
       System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
       System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
       //控制台输出结果
//        取舍之后的结果1:---》-55.555
//        取舍之后的结果2:---》-55.545
       String a="-1";
       String b="55.555";
       String c="55.545";
       BigDecimal bigDecimal_a=new BigDecimal(a);
       BigDecimal bigDecimal_b=new BigDecimal(b);
       BigDecimal bigDecimal_c=new BigDecimal(c);
       BigDecimal bigDecimal_res1=bigDecimal_b.divide(bigDecimal_a,2, RoundingMode.UNNECESSARY);
       BigDecimal bigDecimal_res2=bigDecimal_c.divide(bigDecimal_a,2, RoundingMode.UNNECESSARY);
       System.out.println("取舍之后的结果1:---》"+bigDecimal_res1.toPlainString());
       System.out.println("取舍之后的结果2:---》"+bigDecimal_res2.toPlainString());
       //控制台输出结果
//        控制台异常   
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
   at java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4148)
   at java.math.BigDecimal.needIncrement(BigDecimal.java:4204)
   at java.math.BigDecimal.divideAndRound(BigDecimal.java:4112)
   at java.math.BigDecimal.divide(BigDecimal.java:5198)
   at java.math.BigDecimal.divide(BigDecimal.java:1561)
   at java.math.BigDecimal.divide(BigDecimal.java:1591)
   at lp.jdyc.test.test.main(test.java:41)
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,`RoundingMode`是一个枚举类型,定义在`java.math`包下的`RoundingMode`类中。它提供了一组预定义的策略,用于指示数值运算(如除法和四舍五入)的结果应该按照哪种方式进行舍入。`RoundingMode`枚举包含了以下几个常量: 1. `UNNECESSARY`:表示没有舍入操作,通常在不需要明确舍入行为的情况下使用。 2. `UP`:向上取整,即结果总是大于或等于原始值。 3. `DOWN`:向下取整,即结果总是小于或等于原始值。 4. `CEILING`:对数进行舍入,使其大于或等于最接近的上界(如果结果是负数则为下一个整数)。 5. `FLOOR`:对数进行舍入,使其小于或等于最接近的下界(如果结果是正数则为前一个整数)。 6. `HALF_UP`:银行家舍入,也称为标准舍入,当小数部分在0.5以下时向上取整,否则向下取整。 7. `HALF_DOWN`:与`HALF_UP`相反,当小数部分在0.5以上时向下取整,否则向上取整。 8. `HALF_EVEN`:也称为“银行舍入”,但当小数部分等于0.5时,选择最接近偶数的方向进行舍入。 9. `ROUND_CEILING`:与`CEILING`相同,但名称不同。 10. `ROUND_DOWN`:与`DOWN`相同,但名称不同。 11. `ROUND_FLOOR`:与`FLOOR`相同,但名称不同。 12. `ROUND_HALF_DOWN`:与`HALF_DOWN`相同,但名称不同。 13. `ROUND_HALF_EVEN`:与`HALF_EVEN`相同,但名称不同。 在进行数学运算或者格式化数字时,`RoundingMode`提供了灵活性,允许开发者根据需要精确控制结果的舍入方式。例如,使用`DecimalFormat`时,可以指定`RoundingMode`来定制小数点后位数的舍入行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值