double類型問題(精度丟失和自動拆箱)

  最近在工做中使用了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型得千萬當心。

相關文章
相關標籤/搜索