最近在工做中使用了double類型,遇到了2個問題。一個是自動拆箱,一個是精度丟失。 測試
一.像Long,Integer類型直接使用時會進行自動拆箱,可是使用Double型時不會進行自動拆箱(所使用的JAVA版本是jdk1.6.0_31)。測試代碼以下: spa
public class Test {
private Long l1 = 1L;
private Long l2 = 1L;
private Double d1 =1d;
private Double d2 =1d;
public static void main(String[] args) {
Test t = new Test();
if(t.l1==t.l2) {
System.out.println("Long值相等");
}
if(t.d1==t.d2) {
System.out.println("Double值相等");
}
}
} ip
輸出結果爲: Long值相等 ci
在這過程當中1L被自動裝箱爲Long類型,在進行if語句時又拆箱爲long類型。而Double類型只裝箱沒有拆箱(至於緣由還待研究),因此致使最終的結果。 class
解決方案很簡單:1. 調用Double的doubleValue()手動轉爲double型進行值比較。 jdk
2.調用Double的equals()方法進行比較。 List
出錯場景:直接使用了List<Double> sortResultList = new ArrayList<Double>(); 方法
Map<Long,Double> resultMap = new HashMap<Long, Double>(); im
拿List和Map中的值進行比較使用了==。由於平時Double類型使用較少,而Long Integer使用較多,且他倆使用==不會有問題,因此就想固然的用了==,這種問題通常出了很難查出,尤爲是在計算邏輯比較複雜的狀況下,而我此次恰好是這場景。 sort
二.精度丟失問題
用doule型值進行運算容易形成精度丟失,使結果不許確。
解決方案:經過String 結合BigDecimal。
如:
public class MathUtil { public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } public static double sum(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } public static void main(String[] args) { } } 總之,使用Double型得千萬當心。