• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAにて)

エクセルVBAでの計算結果が異なる理由

このQ&Aのポイント
  • エクセルVBAで計算を行う際に発生する結果の違いについて、具体的な例を挙げながら解説します。
  • VBAの場合、計算の際に浮動小数点数の精度が限定されているため、細かな計算結果の差異が生じることがあります。
  • この差異は、計算に使用する数値の桁数や計算式の組み立て方によっても影響を受けることがあります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

訂正。 0.101010101010101010101011 0.101010101010101010101011000000000000000000000000 0.101010101010101010101010101010101010101010101011 は、それぞれ 0.0101010101010101010101011 0.0101010101010101010101011000000000000000000000000 0.0101010101010101010101010101010101010101010101011 の誤りです。

その他の回答 (3)

回答No.3

Dim KEISAN As Single を Dim KEISAN As Double にしてみましょう。 KEISANが「単精度浮動小数点数」なので (Cells(1, 1) - Cells(1, 2)) * Cells(1, 3) / 1000 の結果が、単精度でKEISANに格納されます。 その状態で Cells(1, 4) = KEISAN を実行すると、単精度で「1.352」になっている数値を、倍制度に変換してD1セルに格納します。 この時「単精度から倍制度への変換」が起きますが、これが起きると「精度誤差」が出ます。 例えば、倍制度が15桁、単精度が7桁の精度で「1/3」を計算します。 1/3の結果は、倍制度で0.333333333333333になります。 この結果を単精度の変数に格納すると0.3333333になります。 単精度になった0.3333333を倍制度のセルに格納すると、0.3333333が0.333333343267441に変換されてしまいます。 これは「7桁から15桁に拡張する時に、丸め誤差が8桁分、大きくなる」からです。 二進化単精度数では、0.3333333は 0.101010101010101010101011 になります。これを倍制度に変換すると 0.101010101010101010101011000000000000000000000000 になってしまいます。倍制度での本当の値は 0.101010101010101010101010101010101010101010101011 なのですが、後半が違ってしまっているのが判ると思います。 同様に、単精度の1.352をセルに格納すると、1.352が1.351999998092651に変換されます。 これも、単精度を倍制度に変換した時に、後半が違う値になってしまったのです。 実際には 1.010110100001110010101100000010000011000100100111 になる筈が 1.010110100001110010101100000000000000000000000000 になっています。後半が違っていますよね。

回答No.2

Dim KEISAN As Single でも、 Cells(1, 4).Value = CDec(KEISAN) にすれば、演算誤差は回避できる。

回答No.1

Doubleは如何?? Option Explicit Sub KEISAN() Dim KEISAN As Double KEISAN = (Cells(1, 1) - Cells(1, 2)) * Cells(1, 3) / 1000 Cells(1, 4) = KEISAN End Sub