Für diesen Codeblock:
int num = 5;
int denom = 7;
double d = num / denom;
der Wert von d
ist 0.0
. Es kann durch Casting zur Arbeit gezwungen werden:
double d = ((double) num) / denom;
Aber gibt es einen anderen Weg, um das richtige double
Ergebnis zu erzielen ? Ich mag es nicht, Primitive zu gießen, wer weiß, was passieren kann.
java
casting
integer-division
Walnussmon
quelle
quelle
Antworten:
Das vermeidet eine Besetzung. Sie werden jedoch feststellen, dass die Besetzungskonvertierungen genau definiert sind. Sie müssen nicht raten, überprüfen Sie einfach die JLS . int to double ist eine zunehmende Umwandlung. Aus §5.1.2 :
5 kann genau als Doppel ausgedrückt werden.
quelle
1.0
ändert den Typ des Ergebnisses nur auf eine andere Art und Weise. "Scheint mir schmutziger Code" erklärt nicht, in welchen Szenarien Sie glauben, dass das Multiplizieren1.0
tatsächlich besser ist (oder warum das so sein könnte).(double)num
irgendwie ändertnum
. Dies ist nicht der Fall - es wird ein temporäres Double für den Kontext der Anweisung erstellt.Was ist falsch daran, Primitive zu gießen?
Wenn Sie aus irgendeinem Grund nicht besetzen möchten, können Sie dies tun
quelle
double d = num * 1D / denom;
Warum hast du eine irrationale Angst davor, Primitive zu wirken? Es wird nichts Schlimmes passieren, wenn Sie ein
int
zu einem werfendouble
. Wenn Sie sich nicht sicher sind, wie es funktioniert, schlagen Sie es in der Java-Sprachspezifikation nach . Das Casting einesint
todouble
ist eine sich erweiternde primitive Konvertierung .Sie können das zusätzliche Klammerpaar entfernen, indem Sie den Nenner anstelle des Zählers setzen:
quelle
double d = (double) num / denom;
... (OK, dies hängt von der Priorität ab)Wenn Sie den Typ einer der Variablen ändern, müssen Sie daran denken, sich erneut zu verdoppeln, wenn sich Ihre Formel ändert. Wenn diese Variable nicht mehr Teil der Berechnung ist, ist das Ergebnis durcheinander. Ich mache es mir zur Gewohnheit, innerhalb der Berechnung zu gießen, und füge einen Kommentar daneben hinzu.
Beachten Sie, dass das Casting des Ergebnisses nicht ausreicht
quelle
Wandeln Sie eine der Ganzzahlen / beide Ganzzahlen in float um, um zu erzwingen, dass die Operation mit Gleitkomma-Mathematik ausgeführt wird. Ansonsten wird immer eine ganzzahlige Mathematik bevorzugt. So:
Beachten Sie, dass das Casting des Ergebnisses nicht ausreicht. Weil die erste Division gemäß der Vorrangregel erfolgt.
Ich glaube nicht, dass es ein Problem mit dem Casting als solchem gibt, über das Sie nachdenken.
quelle
Typ Casting ist der einzige Weg
Produzieren einer
double
aus einer ganzzahligen Division - es gibt keinen anderen Weg ohne Casting (vielleicht werden Sie es nicht explizit tun, aber es wird passieren).Nun gibt es verschiedene Möglichkeiten, wie wir versuchen können, einen genauen
double
Wert zu erhalten (wonum
unddenom
sindint
Typ und natürlich beim Casting ) -mit explizitem Casting:
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
aber nicht
double d = (double) (num / denom);
mit implizitem Casting:
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
aber nicht
double d = num / denom * 1.0;
und nicht
double d = 0.0 + ( num / denom );
quelle
benutze so etwas wie:
(1d ist eine Besetzung zum Verdoppeln)
quelle
Sie könnten erwägen, die Operationen zu verpacken. Beispielsweise:
Auf diese Weise können Sie (nur einmal) nachsehen, ob die Besetzung genau das tut, was Sie wollen. Diese Methode kann auch getestet werden, um sicherzustellen, dass sie weiterhin das tut, was Sie wollen. Es spielt auch keine Rolle, mit welchem Trick Sie die Teilung verursachen (Sie können hier eine der Antworten verwenden), solange das richtige Ergebnis erzielt wird. Überall dort, wo Sie zwei Ganzzahlen teilen müssen, können Sie jetzt einfach anrufen
Utils::divide
und darauf vertrauen, dass es das Richtige tut.quelle
benutze dies einfach.
quelle
Der beste Weg, dies zu tun, ist
quelle