在使用算数运算的时候,我们经常会涉及到取舍问题,下面介绍一下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());
- 二: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());
- 三: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());
- 四: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());
- 五: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());
- 六: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());
- 七: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());
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());
- 八: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());
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)