Offizielle javadoc says dass Math.floor gibt eine doppelte, die "gleich einem mathematischen Integer" ist, aber warum sollte es nicht ein Int zurückgeben?Warum gibt Math.floor ein Double zurück?
Antwort
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.
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.
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. –
@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. –
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
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
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 ...)
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.
Das funktioniert fast, außer dass (int) -1.5 = -1; – PearsonArtPhoto
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:
Warum nicht '(int) Math.floor (a)'? Es ist wahrscheinlich effizienter und es ist kürzer. –
- 1. Math.floor gibt NaN zurück
- 2. Warum gibt der JSONParser immer ein Double zurück?
- 3. Warum gibt C++ beim Dividieren kein Double zurück?
- 4. Warum gibt Enumerable.Empty() ein leeres Array zurück?
- 5. Warum gibt play.libs.Json.toJson ein leeres Objekt zurück?
- 6. Warum gibt map ein leeres Array zurück?
- 7. Warum gibt req.params ein leeres Array zurück?
- 8. Warum gibt IJavaProject.findPackageFragmentRoots ein leeres Array zurück?
- 9. Warum gibt insertNewObjectForEntityForName nur ein NSManagedObject zurück?
- 10. Warum gibt Dappers .Execute (...) ein int zurück?
- 11. Warum: Math.floor (2e + 21)! = ~~ (2e + 21)
- 12. Double-Wert 0 zurück
- 13. Warum gibt is_array() false zurück?
- 14. Warum gibt SelectSingleNode null zurück?
- 15. Cocoa Scripting: Gibt einen Gleitkommawert (double) für "any" -Typ zurück
- 16. Warum gibt os.path.isfile False zurück?
- 17. Warum gibt RedirectToAction null zurück?
- 18. Warum gibt floor keine Ganzzahl zurück?
- 19. Warum gibt file_exists() false zurück?
- 20. Warum gibt CMSampleBufferGetImageBuffer NULL zurück
- 21. Math.floor (N) vs N // 1
- 22. Warum gibt GetFields() nichts zurück?
- 23. Warum gibt getHandler() null zurück?
- 24. Hauptfunktion gibt nichts zurück. Warum?
- 25. CurrentDb.RecordsAffected gibt 0 zurück. Warum?
- 26. Warum gibt SCOPE_IDENTITY() -1 zurück?
- 27. Warum gibt Files.probeContentType Null zurück
- 28. Warum gibt string.contains() false zurück?
- 29. Warum gibt sys.getrefcount() 2 zurück?
- 30. Warum file_get_contents gibt Fehler zurück?
Vermutung, es gilt auch für .Net? – Graviton
scheint inkonsistent mit den Math.Round-Funktionen zu sein, die int/long zurückgeben und die Sonderfälle auf andere Weise behandeln. – zod
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. –