プログラミング基礎知識

VBScript の剰余演算子 “Mod” のバグと修正方法

VBScript の剰余演算子 "Mod" のバグと修正方法

VBScript の剰余演算子 “Mod” に含まれるバグの例/再現方法と、その修正方法をご紹介いたします。

剰余演算子 “Mod” とは?

剰余演算子は、割り算をしたときの「余り」を取得する演算子です。

例えば、10 mod 3 = 1 となります。

Mod 演算子 – Visual Basic | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/mod-operator

バグの再現

当社で開発・保守しております某システムにおいて、クライアント様からご報告頂き 検証してみたところ…剰余演算子 “Mod” のバグであることが判明しました。

vbs でサンプルプログラムを作って検証・再現してみます。

If ((3091470 - 714643) * 0.2 * 62) mod 365 = 0 Then
	Call MsgBox("割り切れる")
Else
	Call MsgBox("割り切れない")
End If

上記のプログラム “sample-mod-bug1.vbs” を Windows PC に保存して実行すると「割り切れる」とメッセージが表示されます。

実際に… ((3091470 – 714643) * 0.2 * 62) ÷ 365 を計算すると、答えは 807,469.995 になります。従って、剰余は 0 ではないので「割り切れない」と表示されるべきです、、

※こういったバグが発生するのは、非常に稀です。10年以上運用稼働中のシステムで数日前に初めて発生しました。

解決策

“Mod” を使用せずに、割り切れるか否か?を判定するしかありません。例えば 以下の通りです…

If ((3091470 - 714643) * 0.2 * 62) / 365 = Int(((3091470 - 714643) * 0.2 * 62) / 365) Then
	Call MsgBox("割り切れる")
Else
	Call MsgBox("割り切れない")
End If

上記を実行すると「割り切れない」と表示されます。

プログラミング相談受付中

自営エンジニア歴 20年以上の 当ブログ作者が、プログラミングに関するオンライン相談(zoom 等)を受付中です。言語は HTML CSS JavaScript jQuery PHP MySQL VBScript など…

詳細・お問い合わせはこちら