こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAにて

A1セルに「150」、B1セルに「46」、C1セルに「13」と入っている状態で
下記マクロを実行するとD1セルに計算結果が入るのですが
その結果が「1.351999998092651」となります。
電卓で計算すると「1.352」になりますし、セルに計算式を入れた場合でも
同様の結果になるのですが、なぜマクロの場合だけ結果が違うのでしょう?
初歩的な質問なのかもしれませんが、分かる方教えてください。

※変数に代入しているのは、D1セルで累積結果を求めたいためです。

Sub KEISAN()
Dim KEISAN As Single
KEISAN = (Cells(1, 1) - Cells(1, 2)) * Cells(1, 3) / 1000
Cells(1, 4) = KEISAN
End Sub

投稿日時 - 2013-01-09 10:56:28

QNo.7882943

困ってます

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

訂正。

0.101010101010101010101011
0.101010101010101010101011000000000000000000000000
0.101010101010101010101010101010101010101010101011

は、それぞれ

0.0101010101010101010101011
0.0101010101010101010101011000000000000000000000000
0.0101010101010101010101010101010101010101010101011

の誤りです。

投稿日時 - 2013-01-09 12:31:21

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

になっています。後半が違っていますよね。

投稿日時 - 2013-01-09 12:25:02

ANo.2

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

投稿日時 - 2013-01-09 11:44:58

ANo.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

投稿日時 - 2013-01-09 11:09:59

あなたにオススメの質問