Perl的
print 2 % -18;
- >
-16
TCL
puts [expr {2 % -18}]
- >
-16
但是VBScript
wscript.echo 2 mod -18
- >
2
为什么不同?
在维基百科的答案是相当有帮助这里.
简短的总结是任何整数都可以定义为
a = qn + r
所有这些字母都是整数,和
0 <= | r | <| n |.
几乎每种编程语言都需要(a/n)*n +(a%n)= a.因此,模数的定义几乎总是取决于整数除法的定义.整数除法有两种选择,负数为2/-18 = 0或2/-18 = -1.根据您的语言的哪一个,通常会更改%运算符.
这是因为2 =( - 1)* - 18 +( - 16)和2 = 0*-18 + 2.
对于Perl来说,情况很复杂.手册页说:"请注意,当使用整数在范围内时,"%"使您可以直接访问由C编译器实现的模数运算符.此运算符不适用于负操作数,但执行速度更快. "因此,如果使用整数在范围内,它可以为Perl选择任一选项(如C).如果使用整数不在范围内,则手册说"如果$ b为负,则$ a%$ b为$ a减去$ b的最小倍数不小于$ a(即结果将小于或等于零)."
维基百科的"Modulo操作"页面解释得非常好.我不会在这里做得更好,因为我可能会犯一个微妙但重要的错误.
它的缺点是你可以用不同的方式定义"余数"或"模数",不同的语言选择了不同的选项来实现.