コンチわー! さいきんコンチで遊びたくて二台目の携帯が欲しいkijimaです(iPhoneユーザーなので。。)


先日、Flash開発中に出力されたログの中に身に覚えのない数字が現れました。

それは以下のような数字。

0.30000000000000004


小数点を含む数字で乗算していたんですが、どうやらそれが原因らしい。ためしにこんなfor文でtraceしてみると、、

for(var i:int=0;i<10;i++){ trace(0.1*i) } //出力 0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6000000000000001 0.7000000000000001 0.8 0.9


乗算に限らず、下のような計算でも同じことが起こるようですね。

trace( 0.1 + 0.2 ); // 出力-> 0.30000000000000004 trace( 1.1 - 0.5 ); // 出力-> 0.6000000000000001


除算では起こりませんでした。

for(var i:int=0;i<10;i++){ trace(i/10) } //出力 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9


Flashでは、JavaScriptと同じく「IEEE-754 倍精度浮動小数点数」という規格を採用しているとのことですが、どうやらこの仕様の影響のようです。…もし間違っていたら、「ちげーよ、このバカメガネ!」と優しく教えてください。

こういう現象が起こるということを知っておくと、思わぬ勘違いをしなくて済みそうです。(ちなみにas2でパブリッシュしてみたところ、この現象は起こりませんでした)

参考記事
Number -ActionScript 3.0 コンポーネントリファレンスガイド
A re-introduction to JavaScript - MDC

HTML5飯