Java signé zéro et de la boxe
Dernièrement, j'ai écrit un projet en Java et a remarqué une étrange caractéristique avec un lit double/Double mise en œuvre. Le type double en Java a deux 0, c'est à dire 0.0 et -0.0 (signé zéro). La chose étrange est que:
0.0 == -0.0
évalue à true
, mais:
new Double(0.0).equals(new Double(-0.0))
évalue à false
. Personne ne sait la raison derrière tout cela?
- L'habituelle façon d'éviter cela est d'ajouter
0.0
. Voir ici pour un peu plus de détails.
Vous devez vous connecter pour publier un commentaire.
Il est expliqué dans la javadoc:
Maintenant, vous pourriez demander pourquoi
0.0 == -0.0
est vrai. En fait, ils ne sont pas strictement identiques. Par exemple:est faux. Cependant, la JLS exige ("en conformité avec les règles de la norme IEEE 754 la norme") que:
donc
0.0 == -0.0
est vrai.Qu'il est important de undertand l'utilisation de signé zéro dans la Double classe. (Charges de Java expérimenté les programmeurs ne sont pas).
La réponse courte est que (par définition) "-0.0 est inférieur 0.0" dans toutes les méthodes de la Double classe (qui est, equals(), comparer(), compareTo(), etc)
Double permet à tous les nombres à virgule flottante à être "totalement ordonnée sur un numéro de ligne".
Les Primitives de se comporter de la façon dont un utilisateur de penser à des choses (un monde réel définition) ... 0d = -0d
Les extraits suivants illustrent le comportement ...
Il y a d'autres posts qui sont pertinentes et très bien expliquer le contexte ...
1: Pourquoi les nombres à virgule flottante ont signé des zéros?
2: Pourquoi Java est Double.comparer(double, double) mise en œuvre de la façon dont il est?
Et un mot de prudence ...
Si vous ne savez pas que, dans la Double classe, "-0.0 est inférieur 0.0", vous pouvez faire prendre lors de l'utilisation de méthodes comme equals() et compare() et compareTo() de Double dans la logique des tests. Par exemple, regardez ...
et égaux, tu pourrais essayer de ... de nouvelles Double(d3).equals(0d) || nouveau Double(d3).est égal à(-0d)
En utilisant == déclaration de la comparaison de valeurs. Avec est égal à votre sont des objets de comparaison.