我正在寻找关于Ruby的模运算如何工作的简单解释以及为什么,在Ruby中
puts 4 % 3 # 1
puts -4 % 3 # 2 <--why?
puts -4 % -3 # -1
但在PHP中:
<?php
echo 4 % 3; # 1
echo -4 % 3; # -1
echo -4 % -3; # -1
在我看来,-4%3实际上是8%3(8是4和-4之间的差异)。
答案 0 :(得分:15)
根据您的定义,它们都可以被认为是正确的。如果a % n == r
,那么它应该保留:
a == q*n + r
其中q == a / n
。
r
是正还是负是由q
的值决定的。所以在你的例子中,可以是:
-4 == -1*3 + (-1) // PHP
-4 == -2*3 + 2 // Ruby
换句话说,%
的定义取决于/
的定义。
另见此处的表格:http://en.wikipedia.org/wiki/Modulus_operator#Remainder_calculation_for_the_modulo_operation。您会发现各种编程语言之间存在很大差异。
答案 1 :(得分:6)
Here's a snippet来自The Ruby Programming Language的主题,由Matz和David Flanagan撰写。
当一个(但不是两个)操作数都是负数时,Ruby执行 整数除法和模运算与语言不同 C,C ++和Java做(但与Python和Tcl语言相同)。 考虑商-7/3。 Ruby向负无穷大转向 返回-3。 C和相关语言反而为零 返回-2。在Ruby中,-a / b等于/ -b但不等于 - (a / b)。
Ruby对模块操作的定义也与C的定义不同 和Java。在Ruby中,-7%3是2.在C和Java中,结果为-1 代替。结果的大小不同,因为商 不同。但结果的标志也不同。在Ruby中,标志 结果始终是第二个操作数的符号。在C和 Java,结果的符号始终是第一个操作数的符号。 (Ruby的余数方法的行为类似于C模运算符。)
答案 2 :(得分:1)
它实际上归结为语言的整数转换/舍入的实现。由于实际的等式是:
a - (n * int(a/n))
等式的int(a/n)
部分不同。如果a == -4
和n == 3
,PHP将返回-1,而Ruby将返回-2。现在这个等式在Ruby中看起来像这样:
-4 - (3 * -2)
这在PHP中
-4 - (3 * -1)
答案 3 :(得分:-1)
根据Wolfram Alpha,2是正确的。
编辑:似乎你应该问为什么PHP会这样运作?
edit2:PHP将其定义为devision A / B的剩余部分。我想,无论你认为它是一个错误,错误,还是一种不同的做事方式取决于你。就个人而言,我选择前2名。