2017-05-07 7 views
1

doublelongという2つの変数yとzを持っています。私の問題は、以下のコードスニペットで見られるように不等な値を持っていても、等価演算子が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よりも1つの少ない値を持っている場合私のクエリは、なぜY == zは真に来てさ。

この動作を説明できる人がいますか。

+0

もたらし、それらの値を印刷しようとしました:

あなたがMath.nextDownを使用して、異なる浮動小数点値を取得する(Long.MAX_VALUE - deltaのように)必要なデルタを見ることができますか? – GhostCat

+0

はい、両方とも異なります –

+0

'2^53 - 1'より大きいlong値は、正確に二重表現で表すことはできません。 –

答えて

4

ここでは2つのことが起こりました。 double == long

  1. longdoubleからpromotedあります。式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より大きいlong値は、正確に二重で表すことはできません。

(double) Long.MAX_VALUE等しい(double) (Long.MAX_VALUE - 1)である。なぜなら、doubleは2つの値を明確に表現するのに十分な精度を持たないからである。

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

これは1024

+0

最初の答えに行く:-) – GhostCat

関連する問題