java基本類型包裝類之間的值比較問題


   廢話不多說,先看代碼

Integer a = 2;
Integer b = 2;
if(a==b){
System.out.println("相等");
}else{
System.out.println("不相等");
}

  有人估計會說,卧槽,這邊簡單的代碼也好意思往這放,答案顯而易見啊,是的,答案當然是相等了,那么再往下看下段代碼

 Integer a = 200;
 Integer b = 200;
 if(a==b){
     System.out.println("相等");
 }else{
     System.out.println("不相等");
 }
             

再運行一下看看,是不是結果出乎意料啊?怎么就不相等了呢???

對於 Integer var = ? 在-128 至 127 范圍內的賦值,Integer 對象是在 IntegerCache.cache 產生,會復用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會復用已有對象,這是個大坑,整型包裝類的值一定要使用 equals 方法進行判斷。
 
再來看一段代碼
        float a = 1.0f-0.9f;
        float b = 0.9f-0.8f;

        if(a==b){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }

        Float x = Float.valueOf(a);
        Float y = Float.valueOf(b);
        if(x.equals(y)){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }

卧槽~怎么都不相等呢?

因為浮點數采用“尾數+階碼”的編碼方式,類似於科學計數法的“有效數字+指數”的表示方式。二進制無法精確表示大部分的十進制小數,所以對於浮點數的對比不能簡單的用== 或 equels方式對比
推薦方式:
1、指定一個誤差范圍,兩個浮點數的差值在此范圍之內,則認為是相等的
        float a = 1.0f - 0.9f;
        float b = 0.9f - 0.8f;
        float diff = 1e-6f;
        if (Math.abs(a - b) < diff) {
            System.out.println("true");
        }

2、使用 BigDecimal 來定義值,再進行浮點數的運算操作。

        BigDecimal a = new BigDecimal("1.0");
        BigDecimal b = new BigDecimal("0.9");
        BigDecimal c = new BigDecimal("0.8");
        BigDecimal x = a.subtract(b);
        BigDecimal y = b.subtract(c);
        if (x.equals(y)) {
            System.out.println("true");
        }

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM