まずを参照してください、これはバグではありません!
数値タイプ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.999999999999999
は33.0
になります。同様に、32.9999999999999879
を印刷すると、32.999999999999986
が得られます - 倍精度はその特別な精度を格納するビットを持たず、最も近い値に置き換えられます。ここでも、これは算術的に最も近いものではなく、標準で定義されているので注意してください。
が推奨読書:http://en.wikipedia.org/wiki/Machine_epsilon
32.9で試しましたか? 32.999999999999999 == 33(つまり.9を繰り返す== 1)nをトレースするだけでしたか? – Mike
javascriptは同じ結果を返し、私はそれが意図された結果だと信じていますが、Floorが何をすべきかの定義には意味がありません...変ですか? – jpea
javascriptのバージョン:http://jsfiddle.net/jpsJ8/ – jpea