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
上記を実行すると「割り切れない」と表示されます。
参考サイト
Mod 演算子 – Visual Basic | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/operators/mod-operator