js の精度損失の問題 (および初心者の推論プロセス)

**

js の精度損失の問題 (および初心者の推論プロセス)

**

(1) 質問: Java と js はなぜ 0.1+0.2=0.30000000000000004 を計算するのですか?


まず第一に、コンピュータに保存されているすべての数値は 2 進数であること、つまり、コンピュータには 01 という数値が 2 つだけ存在することを理解する必要があります
最も表面的な理解: 10 進数の 0.1 を 2 進数に変換: 0.000110011001100110011001100110011...無限ループ
同様に: 10 進数の 0.2 を 2 進数に変換: 0.00110011001100110011001100110011...無限ループ つまり:
無限ループ + 無限ループ=無限ループなのでバイナリ 10進数に変換する場合, エラーが発生し、JavaScript では IEEE 754 標準を使用した 64 ビットの倍精度浮動小数点数です。桁数があり、無限ループすることはできません。

(2) しかし、問題が見つかりました...

ここに画像の説明を挿入します
0.4 (10 進数) = 0.0110011001100110…(2 進数)
0.5 (10 進数) = 0.1 (2 進数)
数値の無限ループ + 有限数 = 数値の無限ループではないでしょうか。論理的に言えば、0.5+0.4 は 0.9 と等しくないはずですが、0.900000000003 のようなものと等しくなるはずです。

(3) 事実確認

// 演算を実行する前に 0.1 と 0.2 をバイナリに変換します
0.0001100110011001100110011001100110011001100110011001101 +
0.0011001100110011001100110011001100110011 0 0110011001101 =
0.010011001100110011001100110011001100110011001100110011

// 10 進数に変換すると、ちょうど 0.30000000000000004 になります。

そして 0.5+0.4: 0.01100110011001100110011001100110011001100110011001101+0.1=0.1110011001100110011001100110011001100110011001100 1 101

// 10 進数に変換するとちょうど 0.9、
それだけです

おすすめ

転載: blog.csdn.net/qq_44646982/article/details/113250349