「被除数 Mod 除数」において、被除数および除数が負数の場合の動作は処理系依存です。
たとえば被除数 = 7、除数 = -3 の場合、剰余の取り方としては
剰余 -2 … (-3) * (-3) - 2 = 7
剰余 +1 … (-2) * (-3) + 1 = 7
のいずれの形にもなりえます。
'【パターンA】
+7 Mod -3 = -2
-7 Mod +3 = +2
+7 Mod +3 = +1
-7 Mod -3 = -1
'【パターンB】
+7 Mod -3 = +1
-7 Mod +3 = -1
+7 Mod +3 = +1
-7 Mod -3 = -1
前者の例は、Windows 10 の電卓アプリ(関数電卓モード)や Excel の Mod 関数。
後者の例は、Windows 7 の電卓アプリ(関数電卓モード)や VBA の Mod 演算子。
どのようなポリシーでこのような仕様なのでしょうか。
VB/VBA の Mod 演算子で剰余演算した結果の符号は、被除数 (演算子の左側の数値) の符号になります。
Excel の MOD 関数で剰余演算した結果の符号は、除数(演算子の右側の数値)の符号になります。
VBA の Mod 演算子は「被除数 - (除数 * (被除数 \ 除数))」に相当します。小数を指定すると整数に丸められます。
VB.NET の Mod 演算子は「被除数 - (除数 * Fix(被除数 / 除数))」に相当します。こちらは小数もサポートしています。
Excel の MOD 関数は「被除数 - (除数 * Int(被除数 / 除数))」です。小数もサポートされています。
たとえば 47.9 Mod 9.35 を求めた場合、
VB.NET では「1.15」を返しますが、
VBA では 48 Mod 9 の整数に丸められて「3」を返します。