Division mit Rest, die in Java nicht funktioniert wie erwartet
class LongDiv{
public static void main(String [] args){
final long x = 24*60*60*1000*1000;
final long y = 24*60*60*1000;
System.out.println(x/y);
}
}
obwohl die erwartete Antwort ist 1000, aber der javac gibt es als 5. Grund?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lange
x
Sie erstellen, ist nicht der Wert, den Sie erwarten. Es ist in den integer-Bereich. Erstellen Sie sehnt sich danach, Verwendung:Den
x
Sie berechnet, in den integer-Bereich, war500654080
. Diese geteilt durch diey
( =86400000
), Ergebnisse in5.794607407407407...
. Java schneidet die Nachkommastellen, die bewirkt, dass die 5.Durch das hinzufügen einer
L
nach der Anzahl Literale, sagen Sie dem compiler zu kompilieren alslong
statt einerint
. Der Wert fürx
Sie erwartet86400000000
. Aber ist kompiliert wurde als int.Können wir reproduzieren den falschen Wert für
x
(500654080
) durch Rundung es zu einer int:long
. Siehe @Peter die Antwort.x
ist trucated ein int, weil der vergessenL
suffix.Ausdrücke
24*60*60*1000*1000
ist einint
Typ nicht einlong
Was Sie wollen, ist24L*60*60*1000*1000
dielong
Dies ist, was Sie haben.
was Sie wollen, ist
1L * 24 * 60 * 60 * 1000 * 1000
.(long) 24 * 60 * 60 * 1000 * 1000
Tricky"!
Das Problem ist, dass von 24, 60 und 1000 sind Java-literal ints. Bevor die Werte zugeordnet sind, x und y, Sie sind abgeschnitten, in int-Werte. Versuchen
genau zu sehen, was ich meine. Die schnelle Lösung ist, um Ihre Literale in long-Werte etwa so:
casting (zwingen) zu lange arbeitet, im Falle von literal-Werte für den rechten Operanden; aber das problem besteht weiterhin im Falle der Zuweisung einer long variable an eine andere, wie in dem unten gegebenen Beispiel:
Nur so konnte ich die richtige Antwort ist durch die Umstellung der Aufteilung der sich danach sehnt in Teilung verdoppelt. Es ist sehr seltsam warum der division der sehnt sich verhält in so geheimnisvoller Weise.
longDivision gibt die Antwort als null in der Erwägung, dass die doubleDivision gibt die richtige Antwort.
Ich hoffe, dies hilft anderen Menschen, die auf ein ähnliches Problem gestoßen...
24*60*60*1000*1000
ist zu groß, um in einint
- und überläufe.