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 ではない というのは、恐い処理系のように思われます。