2009-08-19 9 views
12

warum ist 24 * 60 * 60 * 1000 * 1000 dividiert durch 24 * 60 * 60 * 1000 ungleich 1000 in Java?warum ist 24 * 60 * 60 * 1000 * 1000 dividiert durch 24 * 60 * 60 * 1000 ungleich 1000 in Java?

+23

Da Java in Ost-West-Richtung erstreckt, so ist der Tag ein bisschen länger als 86400000000 Mikrosekunden :-) – balpha

+8

Ich denke, für diese Frage sinnvoll zu sein muss angeben, dass es int bedeutet und nicht lang. Ohne tatsächlichen Code oder Angabe anzuzeigen, ist die Frage mehrdeutig. Das ist die Art von Frage, die ich bei Tests in der Schule hasste - soll ich antworten "es * ist * gleich 1000" (richtig, wenn man lange annimmt) oder soll ich raten, dass der Prof bedeuten soll, dass alles gemacht wird wie ints, und deshalb Überlauf erwähnen? –

Antwort

59

Da die Multiplikation 32 Bit Ganzzahlen überläuft. In 64 Bit ist es in Ordnung:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int intProduct = 24 * 60 * 60 * 1000 * 1000; 
     long longProduct = 24L * 60 * 60 * 1000 * 1000; 
     System.out.println(intProduct); // Prints 500654080 
     System.out.println(longProduct); // Prints 86400000000 
    } 
} 

Offensichtlich nach der Multiplikation überschwemmt hat, wird die Division geht, um diesen Überlauf nicht „rückgängig machen“.

+1

Was bedeutet 1000 Tage * 1000 sowieso? –

+24

Das müssen die neuen "metrischen Jahre" sein, über die sie immer reden. –

+7

1000 Tage * 1000 wären 1.000.000 Tage. Das ist nichts Geheimnisvolles. Nun, 1000 Zoll × 1000 Zoll sind 1.000.000 Quadratzoll, also wären 1000 Tage × 1000 Tage 1.000.000 Quadrat-Tage. Aber ich bin mir nicht ganz sicher, was ein "quadratischer Tag" ist. Vielleicht ist das eine Maßeinheit, die Zeitreisende nutzen, wenn sie sich mit einem pan-dimensionalen Raum befassen. – Jay

22

Sie müssen mit 24L * 60 * beginnen, weil der Int überläuft.

Ihre Frage BTW ist ein copy/paste von Puzzle 3: Lange Abteilung von Java Puzzlers;)

+0

+1 für lange Konstante, um lange statt int zu erzwingen. –

3

Wenn Sie diese Berechnung durchführen möchten, dann müssen Sie entweder wieder um die Operationen (Überlauf zu vermeiden) oder verwenden Sie einen größeren Datentyp. Das eigentliche Problem ist, dass die Arithmetik von Ganzzahlen fester Größe in Java nicht assoziativ ist; Es ist ein Schmerz, aber da ist der Kompromiss.

+0

Nachbestellen der Zahlen wird nicht vermieden, den Überlauf – cherouvim

+0

@ cherouvim, aber die Operationen neu ordnen könnte. – Nosredna

+1

Ich glaube, Thom redet über die Neuordnung der Multiplikation, so dass Sie stattdessen etwas tun: ((24 * 60)/(24 * 60)) * ((1000 * 1000)/(1000 * 1000)) – DeadHead

Verwandte Themen