题
的Perl
print 2 % -18;
- >
-16
的Tcl
puts [expr {2 % -18}]
- >
-16
但VBScript的
wscript.echo 2 mod -18
- >
2
为什么不同?
解决方案
在维基答案是相当有帮助这里。
一个简短摘要是任何整数可以被定义为
α= QN + R
,其中所有这些字母是整数,和
0 <= | R | <| N |。
几乎每一个编程语言将要求(A / N)* N +(A%N)=一个。因此,模量的定义几乎总是依赖于整数除法的定义。有两种选择为整数除法由负数2 / -18 = 0或2 / -18 = -1。根据哪一个是你的语言通常会改变%操作真实的。
这是因为2 =( - 1)* -18 +(-16)和2 = 0 * -18 + 2
有关的Perl情况复杂。 手册页面说:“请注意,当使用整数的范围是,”% “给你取模运算直接访问由你的C编译器实现的,这算不算为负的操作数,以及定义,但它会执行得更快。”因此,它可以选择为Perl(如C)两个选项,如果使用整数在适用范围。如果使用整数不在范围内,手册上说:“如果$ b为负,则$一%$ b为$负的$最小倍数b是不超过$少(即结果将小于或等于零)“。
其他提示
维基百科的“模操作” 页解释了它相当不错。我不会尝试做任何更好的在这里,因为我可能会做一个细微但重要的错误。
它的摩擦是可以以不同方式定义“余数”或“弹性模量”,并且不同的语言选择不同的选项来实现。
分割数和除数,其中之一为负后,必须以至少两种方式将它们分离成商和余数,使得商*除数+余数=数:您可以圆形的商向负无穷大,或接近零。
许多语言只是选择之一。
我无法抗拒指出 Common Lisp的报价两者。
蟒,当然,明确地通知你
>>> divmod(2,-18)
(-1, -16)
不隶属于 StackOverflow