0

を使用して10進数を整数にするトリックがあることを私は知っていますx|0

例えば ​​:

3.14|0 -->3

ここには丸めは含まれていません:

3.999 |0 -->3`

質問

しかし : なぜ

9.99999999999|0収量9

その間

9.9999999999999999|0利回り10

4

2 に答える 2

2

9.9999999999999999小数が多すぎて Javascript 表現の精度が失われ、10 になります。これをテストできます 9.9999999999999999 === 10:true

于 2013-09-02T10:57:04.833 に答える
0

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 に変換するステップで精度が使い果たされると思います。

于 2013-09-02T11:07:12.047 に答える