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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaBigDecimal类提供了一系列方法来进行精确的商业计算。其一些常用的方法包括: - 加法:使用.add()方法进行两个BigDecimal数值的相加操作。例如:num1.add(num2)会返回num1和num2的和。 - 减法:使用.subtract()方法进行两个BigDecimal数值的相减操作。例如:num1.subtract(num2)会返回num1减去num2的结果。 - 乘法:使用.multiply()方法进行两个BigDecimal数值的相乘操作。例如:num1.multiply(num2)会返回num1和num2的乘积。 - 除法:使用.divide()方法进行两个BigDecimal数值的相除操作。需要注意,在进行除法运算时,必须传递第二个参数scale,用于定义结果精确到小数点后的位数。如果不整除且结果为无限循环小数,则会抛出ArithmeticException异常。例如:num1.divide(num2, scale, BigDecimal.ROUND_HALF_UP)会返回num1除以num2的结果,保留scale位小数,并且采用四舍五入的方式进行舍入。 此外,BigDecimal类还提供了一些其他的方法,如toPlainString()方法可以将科学计数法的BigDecimal对象转换为十进制数的字符串形式。例如,plainNum.toPlainString()会返回将科学计数法表示的数值转换为十进制形式的字符串。 在使用BigDecimal进行精确计算时,需要注意以下几点: - BigDecimal对象是不可变的,每次进行加减乘除操作都会返回一个新的BigDecimal对象。 - 建议在构造BigDecimal对象时使用String类型的参数,避免计算误差。 - 在进行除法运算时,一定要传递第二个参数scale,定义结果精确到小数点后的位数。 综上所述,JavaBigDecimal类提供了一系列方法用于进行精确的商业计算,并且需要注意使用时的一些注意事项
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君哥聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值