1.2 − 1.1 は0.1 じゃない??Excelに起こる驚きの計算結果

こんにちは。ユージーン(@Eugene_no2)です!

わたしは普段から仕事でExcelを多用しているのですが、たまたま奇妙な現象を見つけてしまいました。

「1.2 – 1.1」を計算させても、なんと「0.1」にならないんです!

嘘だと思う方はこの記事を読んで、ぜひやってみてください。

1.2 – 1.1 = 0.1 ではない??

わたしが発見した現象は次の通りです。

まず、A1セルに「1.2」、B1セルに「1.1」と入力します。

次に、C1セルに、「=A1-B1」と入れます。

エクセルに小数の計算式を入力

もちろん、結果は言わずもがな、「0.1」のはずです。

こんなの、小学4年生で習う内容です。

さて、計算結果は、

計算結果はもちろん、0.1

はい、もちろん、「0.1」になります。

何だよ、合ってるじゃん、と思いますよね??

でも、実は違うんです。

騙されたと思って、「0.1」と表示されているセルの、小数点桁数の表示を増やしていってみてください。

小数点第16位まで伸ばしていくと、なんと!!

小数点第16位まで伸ばしていくと、わずかな誤差が生じる

0.0999999999999999!!??

この現象を見つけた瞬間は、正直、

これはもしかして、Excelの重大なバグ(不具合)を見つけてしまったんじゃないか?

なんて思いましたが、色々と調べてみた結果、さすがに、そうではありませんでした。

計算結果が0.0999999999999999 になる理由とは?

この結果が生じる理由について、詳しい人に聞いたり、詳しいサイトで調べてみたところ、原因が分かりました。

どうやらExcelにとって、小数点以下の計算を正確に行うのは難しいことらしいのです。

なぜかというと、Excel(コンピューター)の計算は、全て2進数で行われるからだとか。

2進数というのは、学校で習った記憶があると思いますが、「0と1」の世界ですね。

ふだん私たちが使っている10進数では、

1, 2, 3, 4, 5

と数字が進むのに対して、2進数では、

1, 10, 11, 100, 101

と0と1だけで数字が進んでいきます。

更に、Microsoftのサポートページには、次のようにあります。

数値を格納するときには、すべての数や分数が、対応する 2 進数で表現されます。たとえば、1/10 という分数は、10 進法では 0.1 と表現できるのに対し、同じ数を 2 進数で表現すると、次のような循環 2 進数になります。

0001100110011100110011 (以下繰り返し)

この数値は、上記のように無限に繰り返され、有限量の領域では表現できません。したがって、この数値が格納されるときには、約 -2.8E-17 で丸められます。

(引用:Microsoft

つまり10進法で「0.1」というのは、キリの良い数字に見えますが、コンピューターが認識する「0.1」は、2進数なので、無限に小数点が続く値なんですね。

そのままでは、情報が多すぎて処理できないので、実は、Excelに入力された「0.1」は、自動的にちょこっと丸められた、「0.1」に限りなく近いが、0.1とは異なる数字ということになるようなんです。

そういった小数同士を計算させているので、「1.2 – 1.1」も、限りなく「0.1」に近いが「0.1」ではない結果が得られたということのようです。

ただし、Excelには、誤差を自動で取り除く機能もあるらしく、小数点の計算では必ずこのような現象が起こる、というわけでは無いみたい。

このあたりは、かなり小難しい話だったので、ここでは割愛します。

Excel 浮動小数点演算 誤差」などと検索すると、詳しいサイトが見つかりますよ!

ちなみに、この「誤差」は、先ほど書いたように、Excel内部の計算が2進数で行われるゆえに起こる現象ですので、整数同士の計算の場合は、一切誤差は生じないようです。

Excelは、色んな計算が出来ますが、まさか小数の計算が苦手だったんですね。

これ結構知らない人、多いんじゃないかなぁ。

明日のツカミにぜひ!

では、今日も頑張らずに楽しんでいきましょう~!