今日、大いにはまった。
alert( 0.1 + 0.2 );
の結果は、
0.30000000000000004
となる。これは0.1と0.2の組み合わせだけに起こる奇怪な現象という訳ではなくて、「0.9 * 0.1」とか「0.28 * 10」とかでも同様の現象が発生する。またIE、FireFox、Opera、Netscapeといった主要ブラウザ(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) );
も駄目だった。うーん。整数に戻したあとに、割り算するしかないのかなぁ。