日経PC 21 - 日経BP社 ビジネス マンのパソコン誌

このページの本文に進む

日経PC21サイト内リンクへ進む

日経パソコン オンライン
ホーム
ニュース
モバイル&スマートフォン
PC&Mac
DIY PC
周辺機器&カメラ
セキュリティ
クラウド
ソフトウエア
ビギナーズ
用語
日経BP社 パソコン情報
TRENDYnet
日経パソコン
日経PCビギナーズ
日経WinPC

エクセル(Excel)の便利な使いこなし方法を解説するWEBスペシャル

全460ページの「エクセル(Excel)大事典」を読めば“演算誤差の謎”がよくわかる!

“達人”芳坂和行氏に学ぶ、エクセル(Excel)「演算誤差」対策講座

第1回 小数計算で発生する「誤差」

―― 単純な計算の答えが合わない理由

エクセル(Excel)では小数点以下の数は正確には計算できません。小数点以下の数には誤差があるためです。しかし、誤差を理解するには専門的な知識が必要になるので、どうもよくわからないと感じている人も多いと思います。

そこで、この講座では誤差の仕組みと対処方法について、できるだけ一般的な知識だけで理解できるように説明をして行きたいと思います。ぜひこの機会に勉強して、自信を持って計算式を書けるようになってください。

ハル
「あの… 先輩…」
エリカ
「あ、ハルちゃん、どうしたの?」
ハル
「エクセルで資料を作っていたんですが、私、ぶつけちゃって… それで計算が合わなくて…」
エリカ
「え? ぶつけたって、何を?」
ハル
「パソコン… 壊しちゃったかも…」
エリカ
「ええ? パソコンを床に落としちゃったの?」
ハル
「いえ、違うんです。おでこをぶつけちゃったんです。ゴン!って」
エリカ
「あ、本当だ。おでこが赤くなってる… なるほど、睡魔に襲われていたってわけね」
ハル
「すいません…」
エリカ
「そんなことぐらいで壊れたの? 私なんか、何回ぶつけても平気だけど」
ハル
「その… 計算が合わないんです」
エリカ
「計算が合わないって… 入力ミスじゃないの?」
ハル
「何度も確認したんですが…」
エリカ
「ちょっと見せて… これ? 顧客満足度の表ね。前回から 0.1 以上増えているかどうか調べているわけね」
0.1以上なのに0.1にならない。なぜ?
ハル
「『渋谷店』では『4.2』から『4.3』に増えていて、『増減』は『0.1』です」
エリカ
「うん」
ハル
「なのに、式で比べると『0.1』以上にならないんです」
エリカ
「ああ、これは誤差。パソコンが壊れたわけじゃないよ」
ハル
「誤差って… どういうことですか?」
エリカ
「あれ? 研修で勉強しなかったの?」
ハル
「私、都合でエクセルの研修だけ受けられなかったんです。来週、受ける予定なんですが」
エリカ
「そう。じゃあ、詳しいことは研修で勉強してもらうとして、簡単に言うと、エクセルは小数点以下の数は正確には計算できないの」
ハル
「え? 正確に計算できないって… 本当ですか?」
エリカ
「うん。本当」
ハル
「そんな… 小数の計算は電卓でもできますよね。電卓でできるのに、パソコンでできないなんて…」
エリカ
「そうだよね。私も納得できなかったから、パソコンに詳しい人に聞いてみたの。そうしたら、パソコンでも正確な計算はできるんだけど、正確な計算よりもアバウトな計算の方がずっと速くできるんだって。エクセルは計算速度を優先して、正確さを犠牲にしているってこと。エクセルだけじゃなくて、他のパソコンソフトもほとんどそうなんだって」
ハル
「速く計算するためですか… 時間の節約にはなっているんですね」
エリカ
「うん。タイム イズ マネーだからね。結局、エクセルで正確な計算をしたいと思ったら、使う人がそれなりに工夫をする必要があるの」
ハル
「そうだったんですか。全然知りませんでした。それで、どんなことをすれば正確に計算できるんですか?」
エリカ
「まず、数の仕組みを知ること。それから、誤差のある計算式を見つけること。そして、誤差が出ないように計算方法を工夫すること」
エクセル(Excel)で正確に計算するために必要なこと

“数の仕組み”を知る

ハル
「数の仕組みを知るって、どういうことですか?」
エリカ
「エクセルがどんな数を使って、どんなふうに計算するのか理解すること。でも、難しくて私にもよくわからないんだ。簡単に話すね。例えば『0.1』ってセルに入力すると『0.1』って表示されるよね?」
ハル
「はい… でも、それが何か?」
エリカ
「これ、どこからどう見ても 0.1 に見えるんだけど、本当は 0.1 じゃないんだって」
ハル
「え? どういうことですか?」
エリカ
「よくわからないんだけど、そういうことらしいの」
ハル
「0.1 じゃないなら何なんですか?」
エリカ
「0.1 よりちょっとだけ大きい数」
ハル
「ちょっとって… どれくらいですか?」
エリカ
「確か研修のテキストに書いてあった… あ、これこれ」
セルの値はちょうどの数で表示されているが、エクセル(Excel)内部ではわずかに大きい数や小さい数になっている
ハル
「これが『0.1』なんですか?」
エリカ
「うん。『0.2』は本当の 0.2 よりちょっとだけ大きい数で、『0.3』は本当の 0.3 よりちょっとだけ小さい数」
ハル
「うーん… どういうことか、わからないです」
エリカ
「私達には変な数に見えるけれど、パソコンにとっては、こういう数の方が計算しやすいってことなの。種も仕掛けもある話だから、理屈はまた後で勉強してね」
ハル
「そうなんですか…」
エリカ
「とにかく、今、知っておいてほしいのは、セルや数式の中で『0.1』と表示されていても、それは 0.1 ぴったりの数ではないってこと。ちょっとだけ大きい数や、ちょっとだけ小さい数になっているの」
ハル
「わかりました。とっても不思議ですけど、とにかく、そう思うことにします」
エリカ
「こういう誤差のある数を使って計算するわけだから、計算結果にも誤差があるの。例えば『=0.3-0.2』という計算では、0.3 より小さい数から 0.2 より大きい数を引くから、答えは 0.1 より小さい数になる」
=0.3-0.2で行われる内部計算と0.1の内部データ
ハル
「なるほど、そうなりますね…」
エリカ
「『=0.4-0.3』という計算では、0.4 より大きい数から 0.3 より小さい数を引くから、答えは 0.1 より大きい数になる」
=0.4-0.3で行われる内部計算と0.1の内部データ
ハル
「そうか… 計算すると、数によって 0.1 より大きくなったり、小さくなったりするんですね」
エリカ
「つまり、『0.1』と表示されていても、それは 0.1 ぴったりの数ではないし、いつも同じ数というわけでもないの。これが基本。理由はわからなくても、とにかく頭に入れておいてね」
ハル
「わかりました。覚えておきます」

誤差は見えたり見えなかったりする

エリカ
「『0.3-0.2』と『0.1』が違うってことを実際に計算して確認してみようか?」
ハル
「あ、お願いします」
エリカ
「最初に『=IF(0.3-0.2=0.1,"同じ","違う")』っていう式を入れてみて」
ハル
「はい… 『同じ』と表示されました。『0.3-0.2』と『0.1』は同じなんですか?」
エリカ
「そう見えるよね。それじゃ、『=IF(0.3-0.2-0.1=0,"同じ","違う")』という式を入れてみて」
ハル
「あれ? 今度は『違う』になりました…」
エリカ
「次に『=0.3-0.2-0.1』という式を入れてみて」
ハル
「はい… 『0』になります」
エリカ
「それから『=0.3-0.2-0.1+0』と『=(0.3-0.2-0.1)』という式を入れて、表示形式を小数点以下 30 桁くらいの数値にしてみて」
ハル
「0 を足しても、カッコで囲んでも答えは同じはずですよね… あれ? 何か数が出てきました」
「=0.3-0.2-0.1」は「0」になるが「=0.3-0.2-0.1+0」などでは差が現れる
エリカ
「出てきた数が『0.3-0.2』の答えと『0.1』の差」
ハル
「差がマイナスになるってことは、やっぱり『0.3-0.2』の答えの方が『0.1』より小さいんですか?」
エリカ
「うん。そういうことになるね」
ハル
「でも、最初の式の『0.3-0.2=0.1』という比較では『同じ』になるし、『=0.3-0.2-0.1』は『0』になりますよね… どういうことなんですか?」
エリカ
「実は、エクセルには自動的に誤差を取り除く働きがあるの。『0.3-0.2=0.1』という比較では、『0.3-0.2』の答えは『0.1』にものすごく近い数だから同じ数と見なされているわけ」
ハル
「そんな機能があったんですか… でも『0.3-0.2-0.1=0』の比較では、誤差は取り除かれないんですか?」
エリカ
「うん。『0.1』と比較する場合は『0.1』を基準にして、それよりずっと桁の小さい数は誤差だと判断できるんだけど、『0』と比較する場合は、桁の小さい数があっても『0』よりは桁が大きくなるから、それが誤差だとは判断できなくなるみたい」
ハル
「比較する数の大きさによっても違ってくるんですね… 『=0.3-0.2-0.1』が『0』になるのに、『=0.3-0.2-0.1+0』と『=(0.3-0.2-0.1)』が『0』にならないのは、どうしてですか?」
エリカ
「『=0.3-0.2-0.1』の場合、計算の中で一番最後に使った『0.1』を基準にして、それよりずっと桁の小さい数は誤差だと判断して『0』にしているみたい。『=0.3-0.2-0.1+0』の場合は最後の『0』を基準にするんだけど、桁の小さい数があっても『0』よりは桁が大きくなるから、それが誤差だとは判断できなくなってしまうの。『=(0.3-0.2-0.1)』のようにカッコで囲んだ場合も、理由はわからないけど、誤差の大きさを自動的に判断することができないみたい」
ハル
「複雑なことをしているんですね…」
エリカ
「とにかく、ある程度の誤差は自動的に解消されることがあるってこと」
ハル
「誤差を取り除く働きがあるなら、『0.3-0.2=0.1』みたいに比較すれば誤差は出ないんですか?」
エリカ
「ううん、それは違うの。『=IF(1.2-1.1=0.1,"同じ","違う")』という式を入れてみて」
ハル
「『1.2』から『1.1』を引くんですね。この答えも 0.1 だから『同じ』になるはずですが… あ、『違う』になった」
誤差が発生するさまざまなパターン
エリカ
「結局、自動的に誤差を取り除いてくれる機能も充分ではないの」
ハル
「そうですか… 残念です」
エリカ
「こんなふうに計算方法や数によって誤差は見えたり見えなかったりするの。だから、誤差が見えないからと言って、誤差のない数になっていると考えたり、どんな数でも誤差が出ないと考えるのは間違い。このことも大切なことだから覚えておいてね」
ハル
「はい。わかりました」

整数で計算すれば誤差は出ない

エリカ
「顧客満足度の表で『0.1』が『0.1』以上にならなかった理由も、もうわかったでしょう?」
ハル
「『増減』の欄の『=4.3-4.2』という計算の結果が『0.1』よりもちょっとだけ小さい数になっているんですね」
エリカ
「そういうこと。さっきみたいに『=(4.3-4.2-0.1)』という式で確かめてみようか」
ハル
「はい… あ、マイナスの数になりました。やっぱり『=4.3-4.2』の答えは『0.1』より小さいんですね」
4.3-0.2から0.1を引くとマイナスの差が現れる
4.3-4.2の答えは0.1よりも小さくなる
ハル
「計算が合わない理由はわかりました。でも、『4.3-4.2』の答えが『0.1』と同じになるようにするには、どうすればいいんですか?」
エリカ
「小数点以下の数を使うから誤差が出るの。だから、一番わかりやすい方法は、整数だけを使って計算すること」
ハル
「整数には誤差はないんですか?」
エリカ
「うん。整数はどれもぴったりの数だから大丈夫。15 桁を超えるような大きな数のときは気を付ける必要があるけど、今回の表なら問題ないよ」
ハル
「よかった! 何だかほっとしました。整数で計算するっていうことは、『4.3』だったら 10 倍して『43』で計算すればいいんですね?」
エリカ
「うん。そうやって、すべて 10 倍した数で計算すれば小数点以下の数は一切使わなくて済むから、誤差の心配はなくなる。でも、この表では誤差の影響があるのは『0.1』と比較するところだけだから、そこだけ 10 倍した整数で比較すればいいんじゃないかな」
ハル
「10 倍して比較するってことは、『0.1』は 10 倍すると『1』になるから、『=IF(E3*10>=1,"○","")』でいいですか?」
エリカ
「あ、それだけではだめ」
ハル
「え? 何か足りないですか?」
「E3*10>=1」という比較方法に変えたが1以上と判定されない
エリカ
「10 倍するだけでは、誤差も 10 倍されて残ってしまうの。誤差のない数にするには ROUND 関数を使うといいよ」
ハル
「ROUND 関数って、四捨五入する関数ですよね?」
エリカ
「うん。ROUND 関数は誤差を切り捨てたり、反対に切り上げたりして、ぴったりの整数にしてくれるの」
ROUND(E3*10,0)の内部計算
ハル
「それじゃ『=IF(ROUND(E3*10,0)>=1,"○","")』という式になるんですね… あ、『○』が表示されました」
「ROUND(E3*10,0)>=1」という比較方法に変えたら1以上と判定された!
エリカ
「誤差のない整数にして比較しているから、これなら絶対に間違った結果にはならないよ」
ハル
「よかったです… 一時はどうなることかと思ってしまいました」
エリカ
「わからないことがあったら声を掛けてね。本当は私も眠くて眠くて死にそうだったんだ。お陰で目が覚めたよ」
ハル
「ありがとうございます。また教えてください!」

第1回のまとめ

  • 小数点以下の数には誤差がある。
  • 計算方法と数によって誤差は見えたり見えなかったりする。
  • 整数化すれば誤差のない計算ができる。
  • 整数化するには、必要な桁数だけ10倍、100倍などした後、ROUND関数で小数点以下を四捨五入する。

↑ページの先頭へ←直前のページへ

日経PC.21がお薦めする日経BP社のサイト