Lange Division in Java funktioniert nicht wie erwartet

7
%Vor%

obwohl die erwartete Antwort 1000 ist, aber der Javac gibt es als 5. Grund?

    
Aakash Goel 20.07.2011, 17:43
quelle

5 Antworten

13

Die lange x , die Sie erstellen, ist nicht der Wert, den Sie erwartet haben. Es liegt im ganzzahligen Bereich. Verwenden Sie zum Erstellen von Longs:

%Vor%

Das x , das Sie im ganzzahligen Bereich berechnet haben, war 500654080 . Dies ergibt sich aus y (= 86400000 ), ergibt 5.794607407407407... . Java schneidet den Dezimalteil ab, der die 5 verursacht.

Wenn Sie nach dem Zahlenliteral ein L hinzufügen, weisen Sie den Compiler an, es als long anstatt als int zu kompilieren. Der von Ihnen erwartete Wert für x ist 86400000000 . Aber is wurde als int. Kompiliert.

Wir können den falschen Wert für x ( 500654080 ) reproduzieren, indem wir ihn auf ein int abschneiden:

%Vor%     
Martijn Courteaux 20.07.2011, 17:47
quelle
5

Der Ausdruck 24*60*60*1000*1000 ist ein int Typ nicht ein long Was Sie wollen ist 24L*60*60*1000*1000 was ist long

Das hast du.

%Vor%

Was Sie wollen, ist

%Vor%     
Peter Lawrey 20.07.2011 17:47
quelle
2
___ qstnhdr ___ Lange Division in Java funktioniert nicht wie erwartet ___ antwort10103936 ___

casting (forcing) zu langen Arbeiten im Falle von Literalwerten für den rechten Operanden; Das Problem besteht jedoch weiterhin, wenn eine lange Variable einer anderen zugewiesen wird, wie im folgenden Beispiel:

%Vor%

Die einzige Möglichkeit, die richtige Antwort zu bekommen, besteht darin, die Division der Longs in Divisionen umzuwandeln. Es ist sehr merkwürdig, warum sich die Teilung der Sehnsüchte auf so mysteriöse Weise verhält.

longDivision liefert die Antwort als Null, während doubleDivision die richtige Antwort liefert.

Ich hoffe, dies hilft anderen, die ähnliche Probleme haben ...

    
___ answer6766163 ___

Die lange %code% , die Sie erstellen, ist nicht der Wert, den Sie erwartet haben. Es liegt im ganzzahligen Bereich. Verwenden Sie zum Erstellen von Longs:

%Vor%

Das %code% , das Sie im ganzzahligen Bereich berechnet haben, war %code% . Dies ergibt sich aus %code% (= %code% ), ergibt %code% . Java schneidet den Dezimalteil ab, der die 5 verursacht.

Wenn Sie nach dem Zahlenliteral ein %code% hinzufügen, weisen Sie den Compiler an, es als %code% anstatt als %code% zu kompilieren. Der von Ihnen erwartete Wert für %code% ist %code% . Aber is wurde als int. Kompiliert.

Wir können den falschen Wert für %code% ( %code% ) reproduzieren, indem wir ihn auf ein int abschneiden:

%Vor%     
___ answer6766165 ___

%code% ist zu groß, um in ein %code% zu passen und überläuft.

    
___ tag123longinteger ___ Eine lange ganze Zahl ist eine ganze Zahl, normalerweise doppelt so groß wie eine normale ganze Zahl. Es wird in mehreren Programmiersprachen durch das Schlüsselwort 'long' repräsentiert. ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ answer6766241 ___

Tricky eins!

Das Problem ist, dass 24, 60 und 1000 Java-Literal -Ints sind. Bevor die Werte x und y zugewiesen werden, werden sie abgeschnitten, um in int-Werte zu passen. Probieren Sie

aus %Vor%

um genau zu sehen, was ich meine. Die schnelle Lösung besteht darin, Ihre Literale zu langen Werten zu machen:

%Vor%     
___ qstntxt ___
%Vor%

obwohl die erwartete Antwort 1000 ist, aber der Javac gibt es als 5. Grund?

    
___ answer6766160 ___

Der Ausdruck %code% ist ein %code% Typ nicht ein %code% Was Sie wollen ist %code% was ist %code%

Das hast du.

%Vor%

Was Sie wollen, ist

%Vor%     
___
Saasira 11.04.2012 10:12
quelle
1

24*60*60*1000*1000 ist zu groß, um in ein int zu passen und überläuft.

    
matt b 20.07.2011 17:47
quelle
1

Tricky eins!

Das Problem ist, dass 24, 60 und 1000 Java-Literal -Ints sind. Bevor die Werte x und y zugewiesen werden, werden sie abgeschnitten, um in int-Werte zu passen. Probieren Sie

aus %Vor%

um genau zu sehen, was ich meine. Die schnelle Lösung besteht darin, Ihre Literale zu langen Werten zu machen:

%Vor%     
Eric 20.07.2011 17:54
quelle

Tags und Links