/ / Wie vermeide ich die Gefahr einer impliziten Konvertierung in int, die 7/8 * pi = 0 - int, implizite Konvertierung ergibt?

Wie man die Fallstricke der impliziten Konvertierung zu int vermeidet, macht 7/8 * pi = 0 - int, implizite Konvertierung

Zu oft programmiere ich Dinge wie double t= 7/8 * pi, nur um herauszufinden, dass danach t gleich 0 ist. Warum? Wegen einer impliziten Konvertierung in int. Das richtige Ergebnis erhalten Sie, indem Sie die Zahlen doppelt t = 7 * pi / 8 neu anordnen. Jetzt ist der Nominator ein Double und es findet keine Konvertierung statt. (oder double t = 7d / 8 * pi oder 7f oder 7.0 oder ...)

Das Problem ist, es ist so intuitiv, es falsch zu machen!

Wie kann ich das verhindern? Ist es sinnvoll, die implizite Konvertierung vollständig in int umzuwandeln und wie würde ich das tun?

Antworten:

1 für die Antwort № 1

Ist es nicht eine Frage der Rangfolge? Ich verwende 7.0 und oder 8.0, da ich weiß, dass ich Integer-Arithmetik vermeiden möchte.


0 für die Antwort № 2

In Java FindBugs kann vor solchen Konstrukten warnen.

ICAST: Integrales Divisionsergebnis in Double oder Float umgewandelt (ICAST_IDIV_CAST_TO_DOUBLE)

Dieser Code wandelt das Ergebnis eines Integrals umDivision (z. B. int oder long Division) Operation zu verdoppeln oder zu schweben. Division von ganzen Zahlen Kürzt das Ergebnis auf den ganzzahligen Wert, der Null am nächsten kommt. Die Tatsache Dass das Ergebnis doppelt gewirkt wurde, legt nahe, dass diese Präzision erreicht werden sollte wurden beibehalten. Was wahrscheinlich gemeint war, war eines oder beide zu besetzen Die Operanden müssen verdoppelt werden, bevor die Division ausgeführt wird. Hier ist ein Beispiel:

int x = 2;
int y = 5;
// Wrong: yields result 0.0
double value1 =  x / y;

// Right: yields result 0.4
double value2 =  x / (double) y;