Wenn ich anrufe, ist Math.ceil(5.2)
die Rückgabe die double
6.0
. Meine natürliche Neigung war zu denken, dass a zurückkehren Math.ceil(double a)
würde long
. Aus der Dokumentation:
ceil(double a)
Gibt den kleinsten
double
Wert (der der negativen Unendlichkeit am nächsten kommt) zurück , der nicht kleiner als das Argument ist und einer mathematischen Ganzzahl entspricht.
Aber warum double
eher a als a zurückgeben, long
wenn das Ergebnis eine ganze Zahl ist? Ich denke, das Verständnis des Grundes könnte mir helfen, Java ein bisschen besser zu verstehen. Es könnte mir auch helfen herauszufinden, ob ich mich selbst in Schwierigkeiten bringen werde, indem ich auf ein long
z
long b = (long)Math.ceil(a);
immer was ich denke es sollte sein? Ich befürchte, es könnte einige Grenzfälle geben, die problematisch sind.
quelle
Antworten:
Der Bereich von
double
ist größer als der vonlong
. Zum Beispiel:double x = Long.MAX_VALUE; x = x * 1000; x = Math.ceil(x);
Was würden Sie von der letzten Zeile erwarten, wenn sie
Math.ceil
zurückgegeben wirdlong
?Beachten Sie, dass bei sehr großen Werten (positiv oder negativ) die Zahlen sehr spärlich verteilt sind. Die nächste Ganzzahl, die größer als die Ganzzahl
x
ist, ist also nicht,x + 1
wenn Sie sehen, was ich meine.quelle
2^60
kann als doppelt dargestellt werden, während2^60 (+/-) 1
nichtround
a zurücklong
?Ein Double kann größer sein als
Long.MAX_VALUE
. Wenn Sie einenMath.ceil()
solchen Wert aufrufen, erwarten Sie, dass Sie denselben Wert zurückgeben. Wenn es jedoch einen langen Wert zurückgibt, ist der Wert falsch.quelle
double
Werte, die größer als sind, werdenLong.MAX_VALUE
möglicherweise nicht genau dargestellt, sodass dasdouble
Ergebnis vonceil(big_double)
nicht angezeigt wirdbig_double + 1
. Also ist es immer noch falsch ...long
hat keinen Bruchteil.