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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值