Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

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

ちゃんちゃん (^_^;

Bong
エンジニアを支援するサービスが作りたい
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away