Ist Der Mathematik.Boden handeln, wie Mathematik.Runde in ActionScript 3?
Hier ist das problem:
var p:int = 0;
var n:Number = 0;
n = 32.999999999999999;
p = Math.floor(n);
trace(p); //returns 33
n = 32.11111111111111;
p = Math.floor(n);
trace(p); //returns 32
Ich würde erwarten, dass diese beiden Rückkehr 32. Ich habe gesucht, und es scheint, dies ist eine nicht gemeldete Fehler in AS3. Oder ... mache ich etwas falsch?
- Haben Sie versucht, es mit nur 32.9? Kann es sein, dass Sie versuchen, zu genau zu sein und als solche, die es werden könnten, zu sagen, dass 32.999999999999999 == 33 (dh. da .9 wiederholen == 1) Haben Sie versuchen, nur die Ablaufverfolgung n?
- javascript liefert das gleiche Ergebnis, führt mich zu glauben, dass es der beabsichtigten Wirkung, obwohl es nicht sinnvoll ist, mit der definition, was Boden machen soll... komisch?
- javascript-version: jsfiddle.net/jpsJ8
- ja, wie es scheint, ist ein bekanntes Problem mit as3 as2 vs sowie - in diesem KB-Artikel auf die Sie verweisen, nicht mehr gefunden, aber anscheinend beschreibt die prob - kirupa.com/forum/showthread.php?t=247416
- Danke Euch allen -- ich kann nicht machen, n 32.9, denn es kommt von einer audio-Datei, und die Möglichkeit, die ActionScript-Code wird die position in einer Audiodatei. Mist! Mein real n ist oft so: 13202.990233456
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, dies ist kein bug !!!
Sind Sie mit der Anzahl Art
double
- [IEEE Standard for Floating-Point-Arithmetik (IEEE 754)][1]. Dies bedeutet, dass Sie nicht über genaue zahlen, aber angenähert zahlen in der Nähe der genaue Wert.Zum Beispiel, wenn Sie wollen, um zu addieren oder subtrahieren kleinste mögliche Wert der double-Wert in Mantisse um Nummer 33, dann bekommt man Werte:
Deine sind im wesentlichen die nächsten Werte um 33, die doppelten Wert haben kann. Wenn Sie nicht vor Ort die Unterschied -, dann
Nun
32.999999999999999
wird33.0
wenn der code interpretiert oder analysiert, wie eine Reihe. In der gleichen Weise, wenn Sie drucken32.9999999999999879
erhalten Sie32.999999999999986
- Doppel einfach nicht, bits zu speichern, die extra Präzision, und es wird ersetzt mit dem nächsten Wert. Beachten Sie wieder, diese nicht überträgt sich rein rechnerisch am nächsten, aber wie ist es definiert im standard.Empfohlene Lektüre: http://en.wikipedia.org/wiki/Machine_epsilon
Haben Sie gerade erlebt das Phänomen, dass plagen alle Sprachen bis zu einem gewissen Grad oder einem anderen. Floating Point zahlen sind wirklich schwer zu vertreten im Binär -, und als solche können Sie verlieren Präzision, wenn Sie Sie verwenden.
Den zugrunde liegenden computer Lesen n als gleich 33 in diesem Fall lange, bevor Sie versuchen, zu nennen Math.Boden.
Weitere Informationen finden Sie unter Dieser wikipedia-Artikel über Floating-Point -, im Abschnitt über die Genauigkeit
Als andere haben vorgeschlagen, es ist kein bug. Wenn Sie
n = 32.999999999999996
es wird die Runde bis zum erreichen der 32. Wenn Sien = 32.999999999999997
dann ist es das gleiche wien = 33
kann es also nicht wirklich abgerundet.