项目中平时一般的计算使用浮点型和整型是可以满足要求的,有时候对精度要求较高的时候上面的方法不能满足。
这个时候就要使用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
学无止境