Excel で実数を扱うときの注意 セルの謎
2018.7.4
Excel VBA プログラミングで実数を扱うときの注意について
書きます。
コンピュータの世界では数値を 2 進数で表します。
2 進数で表現出来ない数値は循環小数となります。例えば、
10 進数では小数の位は 1 → 0.1 → 0.01 .... と続きますが、
2 進数では小数の位は 1 → 0.5 → 0.25 → 0.125 .... と
続きます。ですから、0.1 は 2 進数では循環小数となり、
0.1 を 10 回足しても 1 にはなりません。
Excel 2016 においては、
セル
VBA の Variant, Double 型変数
のいずれにおいても、この規則があてはまります。
ただし、セル関数の If と VBA の If は異なる結果を返します。
セルを以下のようにします。
A1 〜 A10 に 0.1 を入れる。
A11 は = SUM(A1:A10)
B11 に 1 を入れる。
セル関数で
=IF(A11=1,"o","x")
とすると、"o" となります。しかし、Excel VBA 上で
-------------------------------------------------
Sub check()
If Range("a11") = 1 Then
Debug.print "o"
Else
Debug.print "x"
End If
End Sub
-------------------------------------------------
を実行すると、"x" となります。
VBA の If が "x" を返すことから、A11 は 1+ε の値が
入っているようです(εは微小な値)。
しかし、セル関数の IF は「真」となります。
セル関数の IF はわずかな差であれば、= と判定する
という規則があるように思われます。
しかし、
1 に見える。IF を使っても 1 と等しいと判定する。
しかし、実は 1 ではない
というのは、恐い処理系のように思われます。