同様1/3
に、 を 10 進数で正確に表現する0.1
ことも、2 進数で正確に表現することもできず、Javascript の数値は 2 進浮動小数点値です。
Javascript ではを0.2 + 0.1
返します0.30000000000000004
。
ブラウザのコンソールで試してみてください。
実際には、仮数を Javascript 64 ビット浮動小数点値に格納するために 53 ビットが使用可能であり、0.1
53 ビットの精度に丸められた 2進数の 10 進数値は、10 進
0.00011001100110011001100110011001100110011001100110011010
数に戻すと正確に になり
0.1000000000000000055511151231257827021181583404541015625
ます。
これは Firefox で使用して表示できtoFixed
ます (他のブラウザでは引数が 20 に制限されています):
(0.1).toFixed(55)
return
0.1000000000000000055511151231257827021181583404541015625
.
同様に、0.2
53 ビットの精度に丸められてから 10 進数に戻される 2 進数の 10 進数値は、正確に
0.200000000000000011102230246251565404236316680908203125
です。
と の 2 つのバイナリ表現を加算する0.1
と0.2
、53 ビットに丸められてから 10 進数に変換され、正確に が得られます
0.3000000000000000444089209850062616169452667236328125
。
したがって、Javascriptの0.1
+の結果は ではありませんが、小数点以下 17 桁までは です。0.2
0.3
0.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.5
is1/2
であり、 is の唯一の素因数で2
ある2
ため、正確に表すことができます。