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

 

學無止境

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章