LoginSignup
8
8

More than 5 years have passed since last update.

JavaScriptで0.1を10回積み重ねたけど、なんと合計は「1」じゃない!

Last updated at Posted at 2017-05-14

コードレビューで見抜けなかったバグ

先日とあるお仕事で、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という仕様だそうですね!
仕様ならしようがない。

ディレクター:「計算結果がおかしいです。直してください。」
プログラマー:「仕様です。」

ちゃんちゃん (^_^;

8
8
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8