Java: différent double et double en comparaison
Je sais que Double
est une classe wrapper, et il s'enroule double
nombre. Aujourd'hui, j'ai vu une autre différence importante :
double a = 1.0;
double b = 1.0;
Double c = 1.0;
Double d = 1.0;
System.out.println(a == b); //true
System.out.println(c == d); //false
Si étrange avec moi !!!
Donc, si nous utilisons Double
à chaque fois, nous devons faire quelque chose comme ceci :
private static final double delta = 0.0001;
System.out.println(Math.abs(c-d) < delta);
Je ne peux pas expliquer pourquoi un Double mettre directement la comparaison de mal. Veuillez expliquer pour moi.
Merci 🙂
source d'informationauteur hqt
Vous devez vous connecter pour publier un commentaire.
c
etd
sont techniquement deux objets différents et==
opérateur compare uniquement les références.est meilleur, car il compare les valeurs, pas de références. Mais pas encore idéal. La comparaison des valeurs à virgule flottante directement devez toujours prendre certaines d'erreur (epsilon) compte (
Math.abs(c - d) < epsilon
).Noter que:
ici comparaison du rendement
true
mais c'est plus compliqué (Integer
interne de la mise en cache, décrit dans JavaDoc deInteger.valueOf()
):Pourquoi
valueOf()
? Parce que cette méthode est implicitement utilisé pour mettre en œuvre l'autoboxing:Voir aussi
Lorsqu'il est appliqué à des expressions de type classe,
==
sera toujours effectuer une référence de comparaison (JLS section 15.21.3). Donc cette ligne:est de vérifier si
c
etd
reportez-vous aux mêmes objets. Auto-boxing en Java toujours (je crois) crée un nouvel objet pourfloat
etdouble
(la situation est plus compliquée pour les types intégraux1). Doncc
etd
se référer à des objets différents, et il imprime doncfalse
.Si vous voulez comparer objets pour l'égalité, vous devez appeler
equals
explicitement:Avec
double
c'est à l'aide de l'égalité numérique au lieu - comme spécifié dans section 15.21.1. D'où la différence de comportement.1 intégrale De l'autoboxing, des "petits" les valeurs sont mises en cache - si l'autoboxing 5 (dire) sera de retour à la même référence, à chaque fois. La définition de la "petite" est spécifique à l'implémentation, mais il est garanti à l'intérieur de la plage de -128 à 127. Voir le bas de section 5.1.7 pour plus de détails.
Utilisation
equals()
à des vérifications de l'égalité des 2 objets.==
vérifie si les 2 références se rapportent au même objet en mémoire.La vérification du contenu n'est fiable pour
==
lors de la vérification des types primitifs. Pour les types d'objets, il est toujours préférable d'utiliser laequals
méthode: