2011-03-07 14 views
2

は問題です:Math.floorはActionScript 3のMath.roundのように動作しますか?ここ

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 

私はこれらの両方は、私が検索しました、そしてこれはAS3で報告されていないバグであると思われる32を返すことを期待します。または...私は何か間違っているのですか?

+1

32.9で試しましたか? 32.999999999999999 == 33(つまり.9を繰り返す== 1)nをトレースするだけでしたか? – Mike

+0

javascriptは同じ結果を返し、私はそれが意図された結果だと信じていますが、Floorが何をすべきかの定義には意味がありません...変ですか? – jpea

+0

javascriptのバージョン:http://jsfiddle.net/jpsJ8/ – jpea

答えて

4

まずを参照してください、これはバグではありません!

数値タイプdouble - [浮動小数点演算のIEEE標準(IEEE 754)] [1]を使用しています。つまり、正確な数字はありませんが、正確な値に近い数字は近似しています。あなたは数33の周りに二重の値の仮数に可能な最小の値を加算または減算する場合たとえば、あなたが値を取得

32.999999999999986 
32.99999999999999 
33.0 
33.00000000000001 
33.000000000000014 

汝は二重の値が持つことができることを基本的に33の周りに最も近い値であり、 。あなたは違いを発見しなかった場合は、コードが数として解釈や解析されるとき、[今すぐ

32.99999999999999  // closest lower 
32.999999999999999 // input value 
33.0     // closest higher 

32.99999999999999933.0になります。同様に、32.9999999999999879を印刷すると、32.999999999999986が得られます - 倍精度はその特別な精度を格納するビットを持たず、最も近い値に置き換えられます。ここでも、これは算術的に最も近いものではなく、標準で定義されているので注意してください。

が推奨読書:http://en.wikipedia.org/wiki/Machine_epsilon

+0

ありがとう - 良い答え! – macloo

1

あなたはちょうどすべて言語を多少悩ませている現象に遭遇しました。浮動小数点数はバイナリでは表現が難しいので、使用すると精度が低下する可能性があります。

var p:int = 0; 
var n:Number = 0; 
n = 32.999999999999999; 
p = Math.floor(n); 
trace(p); // returns 33 

Math.floorを呼び出そうとする前に、基礎となるコンピュータがこの場合はnを33に等しいと解釈しています。詳細については

、すべてのThis wikipedia article about Floating Point, in the section about accuracy

+0

n = 6640.907029478458のときにp = 6640を取得します。 – macloo

1

を他の人が示唆したように、それはバグではありません。 n = 32.999999999999996の場合は32に切り下げます。n = 32.999999999999997の場合はn = 33と同じですので、実際に切り捨てることはできません。

関連する問題