java中BigDecimal的使用demo和一些注意点

项目中平时一般的计算使用浮点型和整型是可以满足要求的,有时候对精度要求较高的时候上面的方法不能满足。

这个时候就要使用BigDecimal了

直接上demo:

		BigDecimal a = new BigDecimal("99999999999.0215482");
		BigDecimal b = new BigDecimal("99999999998.0215481");
		System.out.println("a + b : " + a.add(b));
		System.out.println("a - b : " + a.subtract(b));
		System.out.println("a * b : " + a.multiply(b));
        //这里的精度可以自己设置,有需要的话可以自己去试试不同精度的变化
        System.out.println("a / b : " + a.divide(b,3,RoundingMode.CEILING));

结果:

a + b : 199999999997.0430963
a - b : 1.0000001
a * b : 9999999999704309630001.93581982276842
a / b : 1.001

不进行对比开不出有哪些变化和好处,下面看看浮点型的结果是怎么样的?

		double a1 = 99999999999.0215482;
		double b1 = 99999999998.0215481;
		System.out.println("a + b : " + (a1 + b1));
		System.out.println("a - b : " + (a1 - b1));
		System.out.println("a * b : " + (a1 * b1));
		System.out.println("a / b : " + (a1 / b1));

结果:

a + b : 1.999999999970431E11
a - b : 1.0
a * b : 9.99999999970431E21
a / b : 1.00000000001

这样可以看出,使用bigDecimal的结果精度更加高。

 

这里有几个注意点:

1,bigDecimal如果出现不能整除的情况,也就是无限循环小数,会报错

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

解决方法是,根据需要设置精度a.divide(b,3,RoundingMode.CEILING),这里如果不设置可能会报错。

2,将浮点型转为bigDecimal的时候,先将浮点型转换为字符串不然会出现精度丢失。

		System.out.println(Double.toString(2.3658));
		System.out.println(new BigDecimal(Double.toString(2.3658)));
		System.out.println(new BigDecimal(2.3658));

结果:

2.3658
2.3658
2.36580000000000012505552149377763271331787109375

 

学无止境

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值