java中BigDecimal使用和注意事项

时间:2022-07-23
本文章向大家介绍java中BigDecimal使用和注意事项,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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