前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中BigDecimal使用和注意事项

java中BigDecimal使用和注意事项

作者头像
jinjunzhu
发布2020-08-20 15:40:27
1.1K0
发布2020-08-20 15:40:27
举报
文章被收录于专栏:个人开发

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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}

代码语言:javascript
复制
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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jinjunzhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档