it-swarm.com.de

Ist es gültig, ein Double mit einem Int in Java zu vergleichen?

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

Utilities.getDistance gibt doppelt zurück und getAttackRange gibt int zurück. Der obige Code ist Teil einer if-Anweisung und muss wahr sein. Ist der Vergleich also gültig?

Vielen Dank

27
Tasos

Ja, es ist gültig - es wird das int zu einem double befördert, bevor der Vergleich durchgeführt wird.

Siehe JLS, Abschnitt 15.20.1 (Numerische Vergleichsoperatoren) , der mit JLS, Abschnitt 5.6.2 (Binäre Numerische Promotion) verlinkt.

Von letzterem:

Die Erweiterung der primitiven Konvertierung (§ 5.1.2) wird angewendet, um einen oder beide Operanden gemäß den folgenden Regeln zu konvertieren:

  • Wenn einer der Operanden vom Typ double ist, wird der andere in double konvertiert.

  • ...

63
Jon Skeet

Bei Operationen (einschließlich Vergleichen) mit zwei verschiedenen numerischen Typen führt Java eine implizite Erweiterungskonvertierung durch. Das heißt, wenn Sie eine double mit einer int vergleichen, wird die int in eine double konvertiert, damit Java die Werte als zwei doubles vergleichen kann. Die kurze Antwort lautet also ja: Der Vergleich von int und double ist gültig, mit einer Einschränkung.

Das Problem ist, dass Sie nicht zwei Floating-Piont-Werte für die Gleichheit mit ==, <= oder >=-Operatoren wegen möglicher Genauigkeitsfehler vergleichen sollten. Außerdem müssen Sie auf die speziellen Werte achten, die ein Double annehmen kann: NaN, POSITIVE_INFINITY und NEGATIVE_INFINITY. Ich empfehle Ihnen dringend, etwas zu recherchieren und etwas über diese Probleme zu erfahren, wenn Sie doubles vergleichen.

5
Code-Apprentice

Das sollte in Ordnung sein. Wenn bei Gleitkommaoperationen/Vergleichen ein Argument floatend/double ist, wird ein anderes Argument, das int ist, ebenfalls zu demselben befördert.

2
Yogendra Singh

ja, es ist absolut gültig, vergleiche den Datentyp Int und den Datentyp Double.

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

Ja, es ist gültig, und Ihr Code sollte wie erwartet ohne Fehler funktionieren. Dies ist jedoch nicht die bewährte Methode. Statische Codeanalysatoren wie SonarQube zeigen dies als "Major" "Bug" an. 

Major Bug img von sonarQube

Major Fehlerbeschreibung von sonarQube

so kann der richtige Weg dazu sein, 

Double.compare(val1,val2)==0 

wenn ein Parameter keine Fließkommavariable ist, werden sie zum Fließkomma heraufgestuft. 

0
Karthik H

Es wird in Ordnung sein.

Java gibt einfach den Wahrheitswert des numerischen Werts zurück:

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

Der obige Code gibt den Wert true aus.

0
Fr_nkenstien