1. 程式人生 > >java精確計算之BigDecimal

java精確計算之BigDecimal

Java中的計算主要有double,float,int,long,BigDecimal

1、float和double主要使用者科學計算和工程計算,它們執行二進位制浮點運算,這是為了在廣泛的數值範圍上提供較為精確的快速近似計算而設計的。然而它們並沒有提供完全精確的結果,所以不應該被用於需要精確計算的場合。

eg:

  double double_price1 = 1.03;   double double_price2 = 0.42;   System.out.println("double的計算值:"+(double_price1-double_price2));

理論值:0.61

執行結果:double的計算值:0.6100000000000001

對比理論值和執行結果發現:使用double計算時結果會有誤差。

2、精確計算主要使用:BigDecimal、int或long。

    2.1 使用BigDecimal的缺點:

        a.與基本型別相比,BigDecimal的計算很不方便,需使用BigDecimal類的一些方法,不能直接使用+ - * /等數學運算子;

        b.執行效率很慢;

    2.2 使用int、long的缺點:需要自己處理十進位制的小數點。

3、BigDecimal使用中需要注意的問題:

    3.1 new BigDecimal(String val) 優於new BigDecimal(double val)

eg:

  BigDecimal bigDecimal_price1 = new BigDecimal(1.03);   System.out.println("bigDecimal_price1="+bigDecimal_price1);

執行結果:bigDecimal_price1=1.0300000000000000266453525910037569701671600341796875

分析:因為此處使用的構造方法:new BigDecimal(double val)  double受精度影響,所以構造出來的BigDecimal物件與理論值有偏差。

  BigDecimal bigDecimal_price3 = new BigDecimal("1.03");   System.out.println("bigDecimal_price3="+bigDecimal_price3);

執行結果:bigDecimal_price3=1.03  與理論預期無偏差。

    3.2 使用divede()方法時,需注意精度。

System.out.println(new BigDecimal("10").divide(new BigDecimal("3")));

執行結果:丟擲異常

 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

分析:

10/3的結果為無限小數,超出BigDecimal上限。

eg2:divide(BigDecimal divisor, int roundingMode)

System.out.println("0.08/12="+new BigDecimal("0.08").divide(new BigDecimal("12"),10,BigDecimal.ROUND_HALF_UP));

執行結果:0.08/12=0.00666667  與預期結果一致