2013年6月6日木曜日

EXCELでは入力方法にチューイせよ

 普通の電卓では、1÷3×3と順に入力してゆくと、得られる答えは1ではありません。
最初の計算結果を有限の桁数のメモリーに保存し、次の計算では単純にその値を利用しているからです。
 しかし、EXCELではちゃんと1を返します。セルに=(1/3)*3と入力してもそうですし、セル同士の計算結果を合計しても同じです。

 EXCELの計算で不思議なのは、分数の取り扱いです。EXCELでは、セルに分数を打ち込むことができます。やり方は、分数の頭に0を付け、「0 1/3」のように、
一つスペースを付けた後に分数を打ち込みます。このように入力すると、書式は自動的に分数に設定されます。

さて、上記の方法で最初から分数として入力されたセルを計算するとどうなるでしょうか?
実験してみました。


 B列は分数として値を入力、C列は隣りのセルと同じ値の小数を手で入力してみました。
 (3行目と4行目は分数の書式、5行目は書式のユーザー設定で、小数点以下を有効桁数全部表示するように設定しています)

それぞれ3つのセルに入力した値を足すと、分数で入力したセルの合計と小数で入力したセルの合計(6行目)は異なります。
 
しかし、いつでも結果が異なる訳ではないようです。例を挙げます。


 上に同じく、B列は分数を入力、C列は小数を入力しています。今度は同じ結果です。

なぜこうなるのか、EXCEL内部での分数データの持ち方が違うのか、それともプログラミングで循環小数を分数と見なす処理をしているのか、検索してみたのですが情報は得られませんでした。

さらに、分数で入力されたセルと小数で入力されたセルを比較してみました。


 =演算子で値が等しいか比較してみました。1/3は分数入力と少数入力では合計が違う値だったのになんと値は等しいという結果になりました。

 同じ値でも、値の入力方法や小数点以下の処理で違いがでてくるということがあるので気を付けないといけないですね。

なお、EXCELの計算の誤差の話と、端数処理を使った判定での誤差の回避法はなど、興味のあるかたは是非検索してみてください。