JavaScriptは0.1 + 0.2を計算できない

今日、大いにはまった。

alert( 0.1 + 0.2 );

の結果は、

0.30000000000000004

となる。これは0.1と0.2の組み合わせだけに起こる奇怪な現象という訳ではなくて、「0.9 * 0.1」とか「0.28 * 10」とかでも同様の現象が発生する。またIEFireFoxOperaNetscapeといった主要ブラウザ(Safariが手元にないのでどなたかやってみて下さい)が揃って同じ挙動だ。ということはECMA Scriptとしての仕様なのかと感じられる。
例えば、Javaのプリミティブでもdoubleで持てないような桁の場合はまるめられてしまったりする訳だけど、まさか「0.1 + 0.2」が計算できないとは思ってもみなかった。

[追記]
Javaの例が悪かったので追記。

public class Test {
public static void main (String[] args) {
System.out.println((float)0.1 + (float)0.2);
}
}

Javaの場合は型が明示的に存在する言語なので、上記のようにすると0.3になる。
やり口的には

System.out.println((double)0.1 + (double)0.2);

も出来ると思うけれど、OSの制度が64bitまでないと無理かと思う。

[追記 2]

alert( parseFloat(0.1) + parseFloat(0.2) );

も駄目だった。うーん。整数に戻したあとに、割り算するしかないのかなぁ。

2件のコメント

  1. 言語の問題っていうか、、、コンピュータが2進で計算している以上仕方のないことで。
    ちなみにJavaでSystem.out.println(0.1+0.2);を実行してもそうなるよ。

  2. こんにちは。
    >コンピュータが2進で計算している以上仕方のないことで。
    最近、型を意識しなさ過ぎて、こういうことを完全に失念していました。もう暗黙にOS精度でいい感じに計算してくれるという思い込みが先行し過ぎていて。
    あと、Javaは少々説明が悪かったので追記しました。

コメントする

メールアドレスが公開されることはありません。