サンプルプログラム

VBScript – Mod 関数/剰余演算子 のバグの再現方法と解決方法

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

VBScriptMod 関数/剰余演算子に含まれるバグの例/再現方法と、その解決方法をご紹介いたします。

※参考サイトは最下部にまとめております。

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

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

参考サイト

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

COMMENT

メールアドレスが公開されることはありません。