を使用して10進数を整数にするトリックがあることを私は知っていますx|0
:
例えば :
3.14|0
-->3
ここには丸めは含まれていません:
3.999 |0 -->
3`
質問
しかし : なぜ
9.99999999999|0
収量9
その間
9.9999999999999999|0
利回り10
?
を使用して10進数を整数にするトリックがあることを私は知っていますx|0
:
例えば :
3.14|0
-->3
ここには丸めは含まれていません:
3.999 |0 -->
3`
質問
しかし : なぜ
9.99999999999|0
収量9
その間
9.9999999999999999|0
利回り10
?
9.9999999999999999
小数が多すぎて Javascript 表現の精度が失われ、10 になります。これをテストできます
9.9999999999999999 === 10
:true
Firefox のソース コードを調べる必要がありますが、いくつかのサンプルを試すのは興味深いことです。
>>> 9.99999999999999999.toString(2)
"1010"
>>> 9.9999999999999999.toString(2)
"1010"
>>> 9.999999999999999.toString(2)
"1001.1111111111111111111111111111111111111111111111111"
>>> 9.999999999999999.toString(2).length
54
>>> 9.99999999999999.toString(2)
"1001.111111111111111111111111111111111111111111111101"
>>> 9.99999999999999.toString(2).length
53
概算: 約 49 ビットが仮数部に入り、符号と指数用に 15 ビットが残ります。
更新: comp.lang.javascript の FAQ で興味深いエントリを見つけました。http: //www.jibbering.com/faq/#FAQ4_7 を参照してください。double 型の精度が 53 ビットに制限されています。
ビットごとの論理演算または演算の前に double を 32 ビット int に変換するステップで精度が使い果たされると思います。