hirax.net::inside out::2014年05月09日

2014-05-09[n年前へ]

エクセル(に限らず)表示されてる値は「ホント」の値とイコールだとは限りません!?  share on Tumblr 

 Microsoft Excelでルックアップテーブル(入力値と出力値の対応表を使い、入力値から出力値を返す機能)を使いハマった方がいました。その状態を再現してみたのが、下に貼り付けた画面です。(画面右にある)「入力値Table(Index)と出力値Table(Value)を対応付ける対応表」を使い、LOOKUP関数およびVLOOKUP関数により、画面左上部にある入力値(Index)から値出力をさせてみたところです。見るとわかるように、入力値(Index)には1.8とタイプされていて、(対応表は入力・出力の組み合わせとして同じ値が入っているので)返ってくるのも1.8かと思いきや、出力されているのは1.7という結果です。・・・一体なぜなのでしょうか? エクセルの「バグ」なのでしょうか?

 これは、浮動小数点演算の結果によるものです。対応表は1に0.1を繰り返し足すことで作ってあるのですが、10進法の0.1は2進法の分数で表現される浮動小数点では正確に表すことができないため、この「対応表に”1.8”と表示されている値」は、本当は1.8とイコールな値ではないのです。だから、エクセルのLOOKUP関数は1.8とイコールな箇所を見つけることができず、1.7を返すわけです。

 ちなみに、エクセルのブックオプション(計算方法)にある「表示桁数で計算する」というオプションにチェックを入れると、こうした現象は(たいていの場合は)出なくなります。なぜかというと、表示している程度に丸められてしまうため、「本当は1.8とイコールな値ではないもの」も1.8に丸められてしまうからです。

 というわけで、エクセル(に限らず)表示されてる値は「ホント」の値とイコールだとは限りません!?というのが、今日の教訓でした。・・・あるいは、単純明快で無いことをエクセルでやってはイケマセンというのが、本当の今日の教訓かもしれません。

エクセル(に限らず)表示されてる値が「ホント」の値と同じとは限りません!?エクセル(に限らず)表示されてる値は「ホント」の値とイコールだとは限りません!?