コードレビューで見抜けなかったバグ
先日とあるお仕事で、JavaScriptのコードを書いておりました。
そして、確かに合っているはずなのに、な・ぜ・か!こちらの想定通りに、
プログラムが動かないことが発生しました。
「0.1」が曲者だった
以下のコードは、今回の現象を再現するために書いた、サンプルコードです。
0.1を10回足すだけの、シンプルなプログラムになっております。
sample1.js
var total = 0;
for (var i=0; i<10; i++){
total += 0.1;
console.log("total=" + total);
}
その結果がこちら
Console
total=0.1
total=0.2
total=0.30000000000000004
total=0.4
total=0.5
total=0.6
total=0.7
total=0.7999999999999999
total=0.8999999999999999
total=0.9999999999999999
「0.3」が「0.30000000000000004」になっています。
このまま「0.40000000000000004」になると思いきや、普通に「0.4」に戻っています。
そしてまた、「0.7」の次が「0.7999999999999999」になったりと、
なかなか暴れているようですね。。。
ひょっとすると
こういうことですよね。
sample2.js
var total = 0;
for (var i=0; i<10; i++){
total += 0.1;
console.log("total=" + total);
}
if (total == 1) {
console.log("結果:totalは1だよ");
} else {
console.log("結果:totalは1じゃないよ");
}
Console
total=0.1
total=0.2
total=0.30000000000000004
total=0.4
total=0.5
total=0.6
total=0.7
total=0.7999999999999999
total=0.8999999999999999
total=0.9999999999999999
結果:totalは1じゃないよ
あちゃー
やっぱりそうなりますよね~ (>_<)
まとめ
ちょっと調べてみたのですが、どうやらこれは、IEEE 754という仕様だそうですね!
仕様ならしようがない。
ディレクター:「計算結果がおかしいです。直してください。」
プログラマー:「仕様です。」
ちゃんちゃん (^_^;