項目中平時一般的計算使用浮點型和整型是可以滿足要求的,有時候對精度要求較高的時候上面的方法不能滿足。
這個時候就要使用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
學無止境