同様1/3に、 を 10 進数で正確に表現する0.1ことも、2 進数で正確に表現することもできず、Javascript の数値は 2 進浮動小数点値です。
Javascript ではを0.2 + 0.1返します0.30000000000000004。
ブラウザのコンソールで試してみてください。
実際には、仮数を Javascript 64 ビット浮動小数点値に格納するために 53 ビットが使用可能であり、0.153 ビットの精度に丸められた 2進数の 10 進数値は、10 進
0.00011001100110011001100110011001100110011001100110011010
数に戻すと正確に になり
0.1000000000000000055511151231257827021181583404541015625ます。
これは Firefox で使用して表示できtoFixedます (他のブラウザでは引数が 20 に制限されています):
(0.1).toFixed(55)return
0.1000000000000000055511151231257827021181583404541015625.
同様に、0.253 ビットの精度に丸められてから 10 進数に戻される 2 進数の 10 進数値は、正確に
0.200000000000000011102230246251565404236316680908203125です。
と の 2 つのバイナリ表現を加算する0.1と0.2、53 ビットに丸められてから 10 進数に変換され、正確に が得られます
0.3000000000000000444089209850062616169452667236328125。
したがって、Javascriptの0.1+の結果は ではありませんが、小数点以下 17 桁までは です。0.20.30.30000000000000004
実際、0.3とにかくバイナリ自体で正確に表現することはできません。
実際には、10 進値に相当するバイナリとして格納される
0.29999999999999993338661852249060757458209991455078125
ため、Javascript では
0.2 + 0.1 == 0.3が返されますfalse。
10 進数から 2
進数へ
10 進数を 2 進数で正確に表すことができる2のは、最小項で単純な分数として表現したときに、 がその数の分母の唯一の素因数である場合だけです。
たとえば、
0.1は1/10であり、10素因数2および5があるため、正確な表現はありません。
0.5is1/2であり、 is の唯一の素因数で2ある2ため、正確に表すことができます。