web-dev-qa-db-fra.com

Est-il valide de comparer un double avec un int en java?

Utilities.getDistance(uni, enemyuni) <= uni.getAttackRange()

Utilities.getDistance renvoie double et getAttackRange renvoie int. Le code ci-dessus fait partie d'une instruction if et doit être vrai. La comparaison est-elle valide?

Merci

27
Tasos

Oui, c'est valide - cela va promouvoir la int à une double avant d'effectuer la comparaison.

Voir Section JLS 15.20.1 (Opérateurs de comparaison numériques) qui relie à Section JLS 5.6.2 (Promotion numérique binaire) .

De ce dernier:

L'élargissement de la conversion de la primitive (§5.1.2) est appliqué pour convertir l'un des opérandes ou les deux, comme spécifié par les règles suivantes:

  • Si l'un des opérandes est de type double, l'autre est converti en double.

  • ...

63
Jon Skeet

Lors de l'exécution d'opérations (y compris des comparaisons) avec deux types numériques différents, Java effectue une conversion d'élargissement implicite. Cela signifie que lorsque vous comparez une double à une int, la int est convertie en une double afin que Java puisse ensuite comparer les valeurs avec deux doubles. Donc, la réponse courte est oui, comparer un int et un double est valide, avec une mise en garde.

Le problème est que vous ne devez pas comparer l'égalité de deux valeurs de points flottants flottantes à l'aide d'opérateurs ==, <= ou >= en raison d'éventuelles erreurs de précision. De même, vous devez faire attention aux valeurs spéciales qu'un double peut prendre: NaN, POSITIVE_INFINITY et NEGATIVE_INFINITY. Je vous suggère fortement de faire des recherches et de vous renseigner sur ces problèmes lorsque vous comparez doubles.

5
Code-Apprentice

Cela devrait aller. Dans les opérations/comparaisons en virgule flottante, si un argument est flottant/double alors l'autre argument étant int est également promu au même.

2
Yogendra Singh

oui, il est absolument valide comparer le type de données int et le type de données double ..

int i =10;
double j= 10.0;
 if (i==j)
{
System.out.println("IT IS TRUE");
}
1
BRIJESH

Oui, c’est valide, et votre code devrait fonctionner comme prévu, sans aucune anomalie, mais ce n’est pas la meilleure pratique. 

Bug majeur img de sonarQube

Description d'un bug majeur de sonarQube

alors, la bonne façon de faire peut être, 

Double.compare(val1,val2)==0 

si un paramètre n'est pas une variable à virgule flottante, il sera promu en virgule flottante. 

0
Karthik H

Ça va aller.

Java retournera simplement vrai si la valeur numérique est égale:

    int n = 10;
    double f = 10.0;
    System.out.println(f==n);

Le code ci-dessus est vrai.

0
Fr_nkenstien