• 締切済み

VBA 加算演算時のトラブル

事務処理用に準備したVBA処理の数値合計チェックにて本来イコールとなるべきところ、ノットイコールと判定されてしまいます。当該部分を抜き出し、わかりやすくしたものが下記のロジックですが、ここで、test2,test4は結果がイコールとなるものの、test3の場合、ノットイコールとなってしまいます。どなたか、原因につき教えていただけませんか? Dim aaa As Double Dim bbb As Double sub test2() bbb = 16.67 + 16.67 aaa = 33.34 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = 16.67 + 16.67 + 16.67 aaa = 50.01 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = 16.67 + 16.67 + 16.67 + 16.67 aaa = 66.68 If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End sub

みんなの回答

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.2

小数点以下4桁まで精度が必要でしたら通貨型(Currency)にすれば正しく計算されます。 浮動小数点数の誤差 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml 他の方法として、 小数点以下の桁数が2桁までなら、100倍して計算して、100で割れば単純です。 通貨型も内部で10000倍(小数点以下4桁)しています。 ANo.1さんの通り、厳密なら10進型ですね。

uo3-uo3
質問者

お礼

A No.1さんともども、ありがとうございました。 助かりました。

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

2進法を御存知か? コンピュータの世界は基本は2進法で実行されています 小数点以下の場合は近似値でしか表現できないのです 印刷や表示上は適当なところで丸められ表示されているので視覚上同じですが比較が厳密にやられる為です。 有効桁で丸めて比較しましょう If Format(aaa,"#0.00;-#0.00") = Format(bbb,"#0.00;-#0.00") Then 通常なら下記のような形でも問題は起きません If CStr(bbb) = CStr(aaa) Then If CDec(bbb) = CDec(aaa) Then 厳密に行うなら10進型が良いでしょうね Option Explicit Dim aaa Dim bbb Sub test2() bbb = CDec(16.67) + CDec(16.67) aaa = CDec(33.34) If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test3() bbb = CDec(16.67) + CDec(16.67) + CDec(16.67) aaa = CDec(50.01) If bbb = aaa Then ' If Format(bbb, "#0.00;-#0.00") = Format(aaa, "#0.00;-#0.00") Then MsgBox "OK" Else MsgBox "NE" End If End Sub Sub test4() bbb = CDec(16.67) + CDec(16.67) + CDec(16.67) + CDec(16.67) aaa = CDec(66.68) If bbb = aaa Then MsgBox "OK" Else MsgBox "NE" End If End Sub

uo3-uo3
質問者

お礼

目からウロコです。ありがとうございます。 全てクリア、質問してよかったです!!!

関連するQ&A