1.BigDecimal是java提供的了一个数值计算的类,其中方法包括如下:
加:add
减:subtract
乘:multiply
除:divide
指数:pow
绝对值:abs
负值:negate
正值:plus
2.BigDecimal的精度
1)ROUND_UP,小数点进一位,示例如下:
5.5->6,2.5->3,1.6->2,1.1->2,1.0->1,-1.0->-1,-1.1->-2,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal1 = new BigDecimal("3.3").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal1);
BigDecimal bigDecimal2 = new BigDecimal("-3.3").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal2);
BigDecimal bigDecimal3 = new BigDecimal("3.6").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal3);
BigDecimal bigDecimal4 = new BigDecimal("-3.6").setScale(0, RoundingMode.UP);
System.out.println(bigDecimal4);
上面代码依次输出4、-4、4、-4
2)ROUND_DOWN,直接舍弃小数点,示例如下:
5.5->5,2.5->2,1.6->1,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-1,-2.5->-2,-5.5->-5
BigDecimal bigDecimal5 = new BigDecimal("3.3").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal5);
BigDecimal bigDecimal6 = new BigDecimal("-3.3").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal6);
BigDecimal bigDecimal7 = new BigDecimal("3.6").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal7);
BigDecimal bigDecimal8 = new BigDecimal("-3.6").setScale(0, RoundingMode.DOWN);
System.out.println(bigDecimal8);
上面代码依次输出3、-3、3、-3
3)ROUND_CEILING,正数小数点进位,负数小数点舍去,示例如下:
5.5->6,2.5->3,1.6->2,1.1->2,1.0->1,-1.0->-1,-1.1->-1,-1.6->-1,-2.5->-2,-5.5->-5
BigDecimal bigDecimal9 = new BigDecimal("3.3").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal9);
BigDecimal bigDecimal10 = new BigDecimal("-3.3").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal10);
BigDecimal bigDecimal11 = new BigDecimal("3.6").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal11);
BigDecimal bigDecimal12 = new BigDecimal("-3.6").setScale(0, RoundingMode.CEILING);
System.out.println(bigDecimal12);
上面代码依次输出4、-3、4、-3
4)ROUND_FLOOR,正数小数点舍去,负数小数点进位,示例如下:
5.5->5,2.5->2,1.6->1,1.1->1,1.0->1,-1.0->-1,-1.1->-2,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal13 = new BigDecimal("3.3").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal13);
BigDecimal bigDecimal14 = new BigDecimal("-3.3").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal14);
BigDecimal bigDecimal15 = new BigDecimal("3.6").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal15);
BigDecimal bigDecimal16 = new BigDecimal("-3.6").setScale(0, RoundingMode.FLOOR);
System.out.println(bigDecimal16);
上面代码依次输出3、-4、3、-4
5)ROUND_HALF_UP,四舍五入,示例如下:
5.5->6,2.5->3,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-3,-5.5->-6
BigDecimal bigDecimal17 = new BigDecimal("3.3").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal17);
BigDecimal bigDecimal18 = new BigDecimal("-3.3").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal18);
BigDecimal bigDecimal19 = new BigDecimal("3.6").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal19);
BigDecimal bigDecimal20 = new BigDecimal("-3.6").setScale(0, RoundingMode.HALF_UP);
System.out.println(bigDecimal20);
上面代码依次输出3、-3、4、-4
6)ROUND_HALF_DOWN,小数点后第一位大于5(五舍六入),进位,否则,舍去小数点,示例如下:
5.5->5,2.5->2,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-2,-5.5->-5
BigDecimal bigDecimal21 = new BigDecimal("3.5").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal21);
BigDecimal bigDecimal22 = new BigDecimal("-3.5").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal22);
BigDecimal bigDecimal23 = new BigDecimal("3.6").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal23);
BigDecimal bigDecimal24 = new BigDecimal("-3.6").setScale(0, RoundingMode.HALF_DOWN);
System.out.println(bigDecimal24);
上面代码依次输出3、-3、4、-4
7)ROUND_HALF_EVEN,如果小数点左边是奇数,四舍五入,如果小数点左边是偶数,直接舍去小数点,示例如下:
5.5->6,2.5->2,1.6->2,1.1->1,1.0->1,-1.0->-1,-1.1->-1,-1.6->-2,-2.5->-2,-5.5->-6
BigDecimal bigDecimal25 = new BigDecimal("3.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal25);
BigDecimal bigDecimal26 = new BigDecimal("-3.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal26);
BigDecimal bigDecimal27 = new BigDecimal("4.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal27);
BigDecimal bigDecimal28 = new BigDecimal("-4.5").setScale(0, RoundingMode.HALF_EVEN);
System.out.println(bigDecimal28);
上面代码依次输出4、-4、4、-4
8)ROUND_UNNECESSARY,小数点后是0,直接舍去,小数点后不是0,抛出ArithmeticException,,示例如下:
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}
BigDecimal bigDecimal29 = new BigDecimal("1.0").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal29);
BigDecimal bigDecimal30 = new BigDecimal("-1.0").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal30);
BigDecimal bigDecimal31 = new BigDecimal("1.1").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal31);
BigDecimal bigDecimal32 = new BigDecimal("-1.1").setScale(0, RoundingMode.UNNECESSARY);
System.out.println(bigDecimal32);
上面代码依次输出1、-1、 java.lang.ArithmeticException: Rounding necessary、java.lang.ArithmeticException: Rounding necessary
3.注意事项
1)BigDecimal构造函数参数不能传null
2)divide运算,右边不能是0
3)divide运算,最好指定scale,如果不指定,默认为0
BigDecimal bigDecimal = new BigDecimal(7);
System.out.println(bigDecimal.divide(new BigDecimal(3), 2, RoundingMode.HALF_UP));
System.out.println(bigDecimal.divide(new BigDecimal(3), RoundingMode.HALF_UP));
BigDecimal bigDecimall = new BigDecimal(9);
System.out.println(bigDecimall.divide(new BigDecimal(2), 2, RoundingMode.HALF_UP));
System.out.println(bigDecimall.divide(new BigDecimal(2), RoundingMode.HALF_UP));
上面代码依次输出2.33、2、4.50、5