2017-05-07 5 views
1

J'ai deux variables y et z de type double et long. Mon problème est que l'opérateur d'égalité retourne vrai pour eux même s'ils ont des valeurs inégales comme vous pouvez le voir dans l'extrait de code ci-dessous.L'opérateur d'égalité renvoie vrai pour des valeurs inégales

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 
    } 
} 

Ma requête est si z a une valeur inférieure à y, pourquoi y == z se réalise.

Quelqu'un peut-il expliquer ce comportement?

+0

Essayé l'impression de ces valeurs? – GhostCat

+0

Oui, les deux sont différents –

+0

Toute valeur longue supérieure à '2^53 - 1' ne peut pas être représentée exactement comme un double. –

Répondre

4

Deux choses se sont passées ici.

  1. En double == long, le long est promoted à un double. L'expression y == z évalue la même chose que (double) Long.MAX_VALUE == (double) (Long.MAX_VALUE - 1).

  2. double a seulement une précision de 53 bits. Lors de la conversion d'un long> 2 en double, les bits les moins significatifs seront arrondis, rendant (double) Long.MAX_VALUE (= 2 -1) et (double) (Long.MAX_VALUE - 1) devenant la même valeur.

4

Pour évaluer y == z, Java doit promouvoir z à un double.

Toute valeur longue supérieure à 2^53 - 1 ne peut pas être représentée exactement en double.

(double) Long.MAX_VALUEne égale (double) (Long.MAX_VALUE - 1), Puisqu'une double n'a pas assez de précision pour représenter les deux valeurs nettement.

Vous pouvez voir le delta nécessaire (comme dans Long.MAX_VALUE - delta) pour obtenir une autre valeur à virgule flottante en utilisant Math.nextDown:

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

Cela donne 1024.

+0

Mon vote va à la première réponse ici :-) – GhostCat