BigDecimal 和 RoundingMode 相关备注

RoundingMode

UP:绝对值向上进位

0.1+0.02 = 0.12   ==>  0.2
精度设置为1,RoundingMode设置为UP
结果为0.2
(-0.1)+(-0.02) = -0.12    ==> -0.2
精度设置为1,RoundingMode设置为UP
结果为-0.2
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.02");
MathContext mc1 = new MathContext(1, RoundingMode.UP);
BigDecimal c1 = a1.add(b1,mc1);
System.out.println(c1.toString());  // 0.2

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.02");
MathContext mc2 = new MathContext(1, RoundingMode.DOWN);
BigDecimal c2 = a2.add(b2,mc2);
System.out.println(c2.toString());  // -0.2

DOWN:绝对值向下进位

0.1+0.06 = 0.16   ==>  0.1
精度设置为1,RoundingMode设置为DOWN
结果为0.1
(-0.1)+(-0.06) = -0.16    ==> -0.1
精度设置为1,RoundingMode设置为DOWN
结果为-0.1
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.06");
MathContext mc1 = new MathContext(1, RoundingMode.DOWN);
BigDecimal c1 = a1.add(b1,mc1);
System.out.println(c1.toString());  // 0.1

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.06");
MathContext mc2 = new MathContext(1, RoundingMode.DOWN);
BigDecimal c2 = a2.add(b2,mc2);
System.out.println(c2.toString());  //-0.1

FLOOR :数值向下进位

0.1+0.06 = 0.16   ==>  0.1
精度设置为1,RoundingMode设置为FLOOR 
结果为0.1
(-0.1)+(-0.02) = -0.12    ==> -0.2
精度设置为1,RoundingMode设置为FLOOR 
结果为-0.2
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.06");
MathContext mc1 = new MathContext(1, RoundingMode.FLOOR);
BigDecimal c1 = a1.add(b1,mc1);
System.out.println(c1.toString()); //0.1

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.02");
MathContext mc2 = new MathContext(1, RoundingMode.FLOOR);
BigDecimal c2 = a2.add(b2,mc2);
System.out.println(c2.toString());  // -0.2

CEILING :数值向上进位

0.1+0.02 = 0.12   ==>  0.2
精度设置为1,RoundingMode设置为CEILING
结果为0.2
(-0.1)+(-0.06) = -0.16    ==> -0.1
精度设置为1,RoundingMode设置为CEILING
结果为-0.1
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.02");
MathContext mc1 = new MathContext(1, RoundingMode.CEILING);
BigDecimal c1 = a1.add(b1,mc1);
System.out.println(c1.toString());  //0.2

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.06");
MathContext mc2 = new MathContext(1, RoundingMode.CEILING);
BigDecimal c2 = a2.add(b2,mc2);
System.out.println(c2.toString());  // -0.1

HALF_UP :绝对值传统四舍五入,0.5按绝对值向上进位

精度设置为1,RoundingMode设置为HALF_UP 
0.1+0.02 = 0.12   ==>  0.1
0.1+0.05 = 0.15   ==>  0.2
0.1+0.06 = 0.16   ==>  0.2
(-0.1)+(-0.02) = -0.12    ==> -0.1
(-0.1)+(-0.05) = -0.15    ==> -0.2 
(-0.1)+(-0.06) = -0.16    ==> -0.2
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.02");
BigDecimal d1 = new BigDecimal("0.05");
BigDecimal e1 = new BigDecimal("0.06");
MathContext mc1 = new MathContext(1, RoundingMode.HALF_UP);
System.out.println(a1.add(b1,mc1).toString());  
System.out.println(a1.add(d1,mc1).toString());
System.out.println(a1.add(e1,mc1).toString());

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.02");
BigDecimal d2 = new BigDecimal("-0.05");
BigDecimal e2 = new BigDecimal("-0.06");
MathContext mc2 = new MathContext(1, RoundingMode.HALF_UP);
System.out.println(a2.add(b2,mc2).toString());
System.out.println(a2.add(d2,mc2).toString());
System.out.println(a2.add(e2,mc2).toString());

HALF_DOWN :除0.5按绝对值向下进位外,类似于绝对值传统四舍五入

精度设置为1,RoundingMode设置为HALF_DOWN 
0.1+0.02 = 0.12   ==>  0.1
0.1+0.05 = 0.15   ==>  0.1
0.1+0.06 = 0.16   ==>  0.2
(-0.1)+(-0.02) = -0.12    ==> -0.1
(-0.1)+(-0.05) = -0.15    ==> -0.1
(-0.1)+(-0.06) = -0.16    ==> -0.2
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal b1 = new BigDecimal("0.02");
BigDecimal d1 = new BigDecimal("0.05");
BigDecimal e1 = new BigDecimal("0.06");
MathContext mc1 = new MathContext(1, RoundingMode.HALF_DOWN);
System.out.println(a1.add(b1,mc1).toString());
System.out.println(a1.add(d1,mc1).toString());
System.out.println(a1.add(e1,mc1).toString());

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal b2 = new BigDecimal("-0.02");
BigDecimal d2 = new BigDecimal("-0.05");
BigDecimal e2 = new BigDecimal("-0.06");
MathContext mc2 = new MathContext(1, RoundingMode.HALF_DOWN);
System.out.println(a2.add(b2,mc2).toString());
System.out.println(a2.add(d2,mc2).toString());
System.out.println(a2.add(e2,mc2).toString());

HALF_EVEN :银行间舍入法 舍入部分为0.5时,与左右进位距离相等,则向偶数进位

精度设置为1,RoundingMode设置为HALF_EVEN 
0.1+0.02 = 0.12   ==>  0.1
0.1+0.05 = 0.15   ==>  0.2  (左右进位为0.1,0.2  其中2是偶数)
0.1+0.06 = 0.16   ==>  0.2
0.1+0.35 = 0.45   ==>  0.4  (左右进位为0.4,0.5  其中4是偶数)
(-0.1)+(-0.02) = -0.12    ==> -0.1
(-0.1)+(-0.05) = -0.15    ==> -0.2 
(-0.1)+(-0.06) = -0.16    ==> -0.2
(-0.1)+(-0.35) = -0.45    ==> -0.4
System.out.println("==================正数=====================");
 BigDecimal a1 = new BigDecimal("0.1");
 BigDecimal b1 = new BigDecimal("0.02");
 BigDecimal d1 = new BigDecimal("0.05");
 BigDecimal e1 = new BigDecimal("0.06");
 BigDecimal f1 = new BigDecimal("0.35");
 MathContext mc1 = new MathContext(1, RoundingMode.HALF_DOWN);
 System.out.println(a1.add(b1,mc1).toString());
 System.out.println(a1.add(d1,mc1).toString());
 System.out.println(a1.add(e1,mc1).toString());
 System.out.println(a1.add(f1,mc1).toString());

 System.out.println("==================负数=====================");
 BigDecimal a2 = new BigDecimal("-0.1");
 BigDecimal b2 = new BigDecimal("-0.02");
 BigDecimal d2 = new BigDecimal("-0.05");
 BigDecimal e2 = new BigDecimal("-0.06");
 BigDecimal f2 = new BigDecimal("-0.35");
 MathContext mc2 = new MathContext(1, RoundingMode.HALF_DOWN);
 System.out.println(a2.add(b2,mc2).toString());
 System.out.println(a2.add(d2,mc2).toString());
 System.out.println(a2.add(e2,mc2).toString());
 System.out.println(a2.add(f2,mc2).toString());

UNNECESSARY

  /**
     * Rounding mode to assert that the requested operation has an exact
     * result, hence no rounding is necessary.  If this rounding mode is
     * specified on an operation that yields an inexact result, an
     * {@code ArithmeticException} is thrown.
     * Example:
     *Input rounded to one digit with {@code UNNECESSARY} rounding
     *5.5     throw {@code ArithmeticException}
     *2.5     throw {@code ArithmeticException}
     *1.6     throw {@code ArithmeticException}
     *1.1     throw {@code ArithmeticException}
     *1.0     1
     *-1.0   -1
     *-1.1    throw {@code ArithmeticException}
     *-1.6    throw {@code ArithmeticException}
     *-2.5    throw {@code ArithmeticException}
     *-5.5    throw {@code ArithmeticException}
     */
System.out.println("==================正数=====================");
BigDecimal a1 = new BigDecimal("0.1");
BigDecimal e1 = new BigDecimal("0.11");
MathContext mc1 = new MathContext(1, RoundingMode.UNNECESSARY);
System.out.println(a1.add(e1,mc1).toString());

/*输出:
Exception in thread "main" java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1452)
==================正数=====================
    at java.math.BigDecimal.doRound(BigDecimal.java:3752)
    at java.math.BigDecimal.add(BigDecimal.java:1189)
    at main.java.test.main(test.java:31)
*/

System.out.println("==================负数=====================");
BigDecimal a2 = new BigDecimal("-0.1");
BigDecimal e2 = new BigDecimal("-0.10");
MathContext mc2 = new MathContext(1, RoundingMode.UNNECESSARY);
System.out.println(a2.add(e2,mc2).toString());

/*输出:
==================正数=====================
0.2
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值