PR

 計算練習のワークシートを作ってみました(図1)。白いセルに解答を入れます。その後でJ1セルをクリックしてドロップダウンリストから「結果判定」を選ぶと解答が正しいかどうかExcelが判定してくれます。

図1 小数点計算ドリルを作ってみた。J1セルに「結果判定」という文字を入れると答え合わせをする。しかし、第2問の解答は正しいはずだ。Excelの判定がおかしい

 Excelは計算が得意ですから、採点まで楽々のはずが、第2問の判定には異議を唱えざるを得ません。

 単に判定の計算式が間違っているのでは、という指摘はある意味で正しいのですが、詳しく調べてみましょう。

 まず判定の方法を説明しておきます。図1をよく見るとI列が非表示になっています。Excelが計算した解答を入れてあるためです。その解答と回答者が入力した答えとをIF関数で比較して、同じなら「正解」、違っていたら「間違い」と表示しています。

 Excelの計算に間違いはないのでしょうか。図2はいろんな数値から0.1だけ小さい数値を引いた結果を表示したものです。小数点以下がゼロでない場合は最大16桁まで表示しています。1.0から0.9を引けば「0.1」だというのは当たり前です。ところが1.2から1.1を引くと「0.0999…」と、何やら変な値を示しています。図1で問題になった2.3-2.2の結果は「0.099…96」となっていますから、Excelの計算結果が間違いです。

図2 例えば「1-0.9」のように、0.1小さい値を引くと答えは当然「0.1」と表示されるはずだが、小数点以下がゼロでない場合、16桁まで表示してみると……

たまには間違うこともある

 「間違い」などと書くと専門家からお叱りを受けるかも知れません。その場合はExcelの内部で2進数演算をしているのが原因となった誤差と読み替えていただいても結構です。

 もともとExcelの計算精度は10進数で15桁あり、普通の電卓よりもずっと高い精度ですから誤差を気にする機会はそれほどありません。ところが内部で2進数演算をしているために、小数点以下の数値に思わぬ誤差が含まている場合があります。

 「0.1」という値は10進数でならきっちりと表現できますが、Excel内部の2進数では完全には表現できない無限小数になってしまいます。無限小数というのは10進数でなら1÷3を小数で表そうとすると0.3333…となって、完全には表せない値です。

 実は図2できっちり「0.1」と計算できている数の組み合わせもあることに驚くべきかも知れません。2進数では完全な表現ができない値であるにもかかわらず、Excelが懸命に帳尻を合わせているようです。

 もっともExcelでこうした誤差に遭遇するのはまれです。とは言えゼロではありませんから、小数を含んだ数値をIF関数で判定するときは入念に式を書いてください。ROUND関数を使って、小数点以下の必要な桁数に四捨五入しておけばいいでしょう。

 日経パソコンのホームページにあるファイルには誤差を含んだワークシートと、誤差を回避したワークシートの両方が入っています。シートの保護機能も使って、解答後に[Enter]キーを押すと、次の回答欄に飛ぶなどの処理もしてあります。ぜひダウンロードしてお試しください。

■解説で使用したExcelファイルを以下からダウンロードできます。

 自己解凍形式(41KB)
 Excelファイル形式(36KB)

 うまくダウンロードできない場合は日経パソコン講座ファイルのダウンロード方法をご覧ください。