最近、学習過程で発見されたJSは、コンピュータで見つかった、非常に興味深いものをJS 0.1 + 0.2〜0.3、しかし0.30000000000000004の結果ではなく、最初にして、小数の乗算を追加し、そして格差は0.3希望を取得するために戻ってきました
私は結果が0.30000000000000004で、PythonのFOUNDが同じである、のpythonでそれを試してみました。
それから私は、収集情報を始め、最終的に答えを見つけました。バイナリ、指数関数、IEEE 754規格:の理由を知りたい、我々は最初にこれらの点を理解する必要があります。
1、バイナリー
コンピュータ内のすべてのデータは、整数、浮動小数点、およびデータの他のすべてのタイプを含む、バイナリ形式で格納されています。私たちは、バイナリ0.1と0.2に小数ます
この方法は、比較的単純な変換であり、バイナリ整数に変換:2及び図100において、例えば、から余りを切り上げた整数で割られます。
バイナリ小数に変換され、小数部2を順次丸め、無限が乗算されます。図1を用いて、実施例0.375。
2、指数関数
指数関数的で限られたスペースに格納することができるより大きな値を表します。
全ての10進数は、指数関数形で表すことができ、M * 105 = DとなるE例えば100のように、* 1のように表すことができる2。
進数は指数形、M = B * 2で表すことができるEの Mは、ビットBの数であり、Eは指数である形態、そのような0.011として1.1×10として表すことができる-10「-10」-2ここで示されます。
図3に示すように、浮動小数点IEEE754標準
JavaScriptは、整数のすべての数値を含み、小数点は一種類のみであり、二重標準の倍精度浮動小数点数である64ビット固定長を表すために使用されるIEEE 754標準を、以下。
ここで最初の符号ビット「1」負が表すが、「0」が正の数を表します。
バイナリ0.1への最初の変換小数:0.0011001100110011 ......
次いで、これを二進小数0.2に変換される:0.0011001100110011 ........
第二に、0.1及び0.2は、バイナリ指数形式に変換します
小数:0.1
バイナリ形式:0.000110011001100110011 ......
指数形式:1.10011001100110011 ...... * 2- 100 の//インデックス-4
小数:0.2
バイナリ形式:0.001100110011001100110011 ......
指数形式:1.100110011001100110011 ...... * 2 -11 //インデックス-3
第三に、標準IEEE754形式の変換インデックス
ここではIEEE754標準指定仮数だけ52を保持することができますので、それは(のみ52進を残して、無限小数が丸みを帯びている実行する必要があること、全ての第2 53最初の53あきらめ、「0と1を切り上げ」、および最初の52後1にして、入力する必要があり)
IEEE 754規格に小数を変換する0.2:
第四に、IEEE 754 0.1 + 0.2の使用形態
これは、書き込みが...... 100111 10.0100100100100100100100100100100ですが、結果のインデックス番号がまだ指数関数的である。この時間は、あなたがそれをバイナリ形式に変換したいと、それは簡単であるべき、長すぎる、小数点が3になるように前方に移動することです0.01001001001001001001001 ..... 00111
次に進数に変換される0 * 2 -1 + 1 * 2- 2 + 0 * 2 -3 + 0 * 2 -4 ....... + 1 * 2 -52次いで、得られる0.30000000000000004インクルード
それはこれに沸きます:
限られたスペースにデータを記録したコンピュータは、唯一の固定長データストレージ、エンドレスループとしてデータの一部を丸くすることができ、そしていくつかのデータ自体は多少の誤差を有することができるので、誤差は加算演算を行う必要があります。
次いで、(0.1×10 + 0.2×10)最後に見/ 3は、それが乗算整数となるので10、0.1と0.2が最初なぜに等しい、その後の整数加算を見てください。
最後に、3月10日とし、我々は、私は思っていないよ、0.3を取得する方法このカウント、それを直接電卓-..-