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)
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()方法時,需注意精度。
eg1:divide(BigDecimal divisor)
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)
eg3:divide(BigDecimal divisor, int scale, RoundingMode 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 與預期結果一緻