Les autres réponses sont correctes, donc je ne les répéterai pas ici.
Ce que je veux ajouter une autre surprise potentielle sur les considérer == comme une relation d'équivalence, ce qui implique normalement l'associativité:
(a == b) and (b == c) => (a == c)
Mais si vous essayez cet extrait par exemple dans https://repl.it:
class Main {
public static void main(String[] args) {
int i=16777217;
float f=16777216.0f;
double d=16777216.0;
if(i == f) {
System.out.println("i == f");
}
if(d == f) {
System.out.println("d == f");
}
if(i == d) {
System.out.println("i == d");
}
}
}
La surprise est que i==f
et f==d
mais not(i==d)
...
en effet, lors de l'écriture i==f
, un conversion implicite float(i)==f
arrive, et cette conversion potentiellement perdre la précision, car un int peut exiger jusqu'à 31 bits de précision, tandis qu'un flotteur offre au plus 24.
Cela aurait pu être différent, si vous regardez comment Lisp, Scheme ou récente Squeak/Smalltalk Pharo gère les comparaisons, vous verrez qu'ils se soucient de l'exactitude ...
Extrait de http://www.lispworks.com/documentation/lcl50/aug/aug-170.html
En général, lorsqu'une opération implique à la fois rationnel et un argument à virgule flottante, le nombre rationnel est d'abord converti en format à virgule flottante, puis l'opération est pe rformé. Ce processus de conversion est appelé contagion en virgule flottante. Cependant, pour les comparaisons d'égalité numérique, les arguments sont comparés en utilisant l'arithmétique rationnelle pour assurer la transitivité de la relation d'égalité (ou d'inégalité).
La précision est la précision comme ce serait avec deux variables 'float', c'est une [conversion d'élargissement] (https://docs.oracle.com/javase/specs/jls/se8/html/jls- 5.html # jls-5.1.2). –
https://stackoverflow.com/questions/13297207/is-it-valid-to-compare-a-double-with-an-int-in-java –
https://stackoverflow.com/questions/41653576/is -it-safe-to-compare-a-float-et-un-int-en-java –