Il n'est pas possible de comparer les valeurs de type float
et double
directement. Avant les valeurs peuvent être comparées, il est nécessaire de convertir l' double
de float
, ou de convertir l' float
de double
. Si l'on fait le ancien titre de comparaison, la conversion se demander "est ce que la de la float
détiennent la meilleure possible float
de la représentation de l' double
's de la valeur?" Si on fait la conversion de ce dernier, la question sera "l' float
détiennent une représentation parfaite de l' double
s'valeur". Dans de nombreux contextes, la première question est la plus significative, mais Java suppose que toutes les comparaisons entre float
et double
sont destinés à poser la dernière question.
Je voudrais suggérer que, indépendamment de ce qu'est une langue disposés à tolérer, les normes de codage doit absolument positivement interdire de faire des comparaisons directes entre les opérandes de type float
et double
. Compte tenu de code comme:
float f = function1();
double d = function2();
...
if (d==f) ...
il est impossible de dire ce comportement est prévu dans les cas où l' d
représente une valeur qui n'est pas exactement représentable en float
. Si l'intention est d' f
être converti en double
, et le résultat de la conversion en comparaison avec d
, on devrait écrire la comparaison comme
if (d==(double)f) ...
Bien que le transtypage ne change pas le comportement du code, il est clair que le code de comportement est intentionnel. Si l'intention était que la comparaison indiquer si f
détient le meilleur float
de la représentation de l' d
, il convient de:
if ((float)d==f)
Notez que le comportement de c'est très différent de ce qui allait se passer sans la fonte. A votre code original cast le double
opérande de chaque comparaison float
, puis les deux tests d'égalité serait passé.