2009-02-04 15 views

Antwort

64

Nach dem gleichen Javadoc-:

Wenn das Argument NaN oder eine positive Unendlichkeit oder null oder negativ Null ist, dann ist das Ergebnis das gleiche wie das Argument. Kann das nicht mit einem int tun.

Der größte doppelte Wert ist auch größer als der größte int, also müsste es ein langer sein.

+1

Vermutung, es gilt auch für .Net? – Graviton

+33

scheint inkonsistent mit den Math.Round-Funktionen zu sein, die int/long zurückgeben und die Sonderfälle auf andere Weise behandeln. – zod

+1

Beachten Sie, dass Javadoc sagt, dass es _ _ den größten (am nächsten an der positiven Unendlichkeit) *** Fließkommawert *** zurückgibt, der kleiner oder gleich dem Argument ist und gleich einer mathematischen Ganzzahl "_" ist. Gegeben ist ein Wert _x> 2^53_, der nicht mit dem Wert übereinstimmt, dessen Bruchteil abgeschnitten ist. Es kann durchaus ein bisschen kleiner sein. –

13

Es ist für Präzision. Der doppelte Datentyp hat eine 53-Bit-Mantisse. Unter anderem bedeutet das, dass ein Double alle bis zu 2^53 ohne Präzisionsverlust darstellen kann.

Wenn Sie eine so große Zahl in einer Ganzzahl speichern, erhalten Sie einen Überlauf. Ganzzahlen haben nur 32 Bits.

Die Ganzzahl als Doppel zurückzugeben ist hier richtig, weil sie einen viel breiteren Zahlenbereich bietet als eine ganze Zahl.

+0

Es könnte natürlich lange dauern, um mit solchen Werten fertig zu werden. Du müsstest immer noch herausfinden, was du mit Double> 2^63 tun kannst. –

+1

@Jon, stimmt, aber das würde zu einem Performance-Impact führen (keine Konvertierungsinstruktion von Long zu Double in irgendeinem mir bekannten Instruction-Set). Ich frage mich, was Math.floor mit Doubles> 2^53 an erster Stelle macht. Einige Ergebnisse sind nicht darstellbar. –

+0

Aber dann ist die pseudo-idiomatische Form (int) Math.floor (foo), die auch im offiziellen Javadoc erscheint, unsicher, da das Ergebnis vielleicht nicht in ein int passt, oder? Und dann noch einmal, welches ist eine sichere Form, um Math.floor zu verwenden, da das Ergebnis eventuell nicht einmal lange passt? – Raibaz

0

So dass Fehler und andere nicht ganzzahlige Werte eine Reihe von Berechnungen korrekt kaskadieren können.

Wenn Sie zum Beispiel Not a Number (NaN) in Math.floor eingeben, wird es weitergeleitet.

Wenn es Ganzzahl zurückgegeben hat, konnte es diese Status oder Fehler nicht weitergeben, und Sie könnten schlechte Ergebnisse aus einer früheren Berechnung erhalten, die gut aussehen, aber nach der weiteren Verarbeitung falsch sind.

-Adam

3

Was würden Sie wollen, dass es zurück, wenn Sie es sich um eine Doppel größer ist als der größte int oder lang gab?

(Zugegeben, wenn es größer ist als die größte lange die Präzision ohnehin gering sein wird - es ist die nächste theoretische ganze Zahl nicht sein kann - aber auch so ...)

0

So wie es eine ganze Zahl ist und eine Gleitkomma Aufteilung in Java gibt es Integer- und Floating-Point-Wege Boden zu tun:

double f = Math.floor(x); 

oder

int k = (int) x; 

, aber Sie müssen immer mit der Verwendung von Boden mit f vorsichtig sein Inite-Precision-Arithmetik: Ihre Berechnung von x kann etwas wie 1.99999999 ergeben, das auf 1, nicht auf 2 von beiden Formen auflöst. Es gibt viele Algorithmen, die diese Einschränkung umgehen müssen, um falsche Ergebnisse für einige Eingabewerte zu vermeiden.

+4

Das funktioniert fast, außer dass (int) -1.5 = -1; – PearsonArtPhoto

5

Andere haben dir gesagt, warum, ich werde dir sagen, wie man richtig rundet, wenn man das will. Wenn Sie nur positive Zahlen verwenden wollen, dann können Sie diese Anweisung verwenden:

int a=(int) 1.5; 

jedoch die (int) immer rundet auf 0. Wenn Sie also eine negative Zahl zu tun:

int a=(int) -1.5; //Equal to -1 

In meinem Fall wollte ich das nicht tun.Ich habe den folgenden Code verwendet, um die Rundung zu tun, und es scheint alle Randfälle gut zu behandeln:

+2

Warum nicht '(int) Math.floor (a)'? Es ist wahrscheinlich effizienter und es ist kürzer. –

Verwandte Themen