2017-05-07 80 views
1

我有兩個變量y和z,類型爲doublelong。我的問題是相等運算符對它們返回true,即使它們具有不同的值,如下面的代碼片段中所示。平等運算符對不等值返回true

public class Test { 
    public static void main(String[] args) throws Exception { 
     double y = (double) Long.MAX_VALUE; 
     System.out.println(y);//9.223372036854776E18 
     long z = Long.MAX_VALUE - 1; 
     System.out.println(z);//9223372036854775806 
     System.out.println(y == z);//=============true 
    } 
} 

我的查詢是如果Z具有小於Y一個值,爲什麼ÿ== z爲即將實現

有人可以解釋這種行爲。

+0

嘗試打印這些價值觀? – GhostCat

+0

是的,它們都不相同 –

+0

任何大於'2^53 - 1'的長整數值都不能完全表示爲雙精度值。 –

回答

4

這裏發生了兩件事。

  1. double == long,所述longpromoteddouble。表達式y == z的計算結果與(double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1)相同。

  2. double只有53位精度。當將long> 2轉換爲double時,最低有效位將被舍入,使得(double) Long.MAX_VALUE(= 2 -1)和(double) (Long.MAX_VALUE - 1)成爲相同的值。

4

評價y == z,Java有促進z爲雙。

大於2^53 - 1的任何長整數值都不能用double表示。

(double) Long.MAX_VALUE確實等於(double) (Long.MAX_VALUE - 1),因爲雙沒有足夠的精度明顯代表了兩個值。

你可以看到需要的增量(如Long.MAX_VALUE - delta)獲得使用Math.nextDown不同的浮點值:

double delta = y - Math.nextDown(y); 

這將產生1024

+0

我的投票去這裏的第一個答案:-) – GhostCat