与php相比,ruby中的模数操作数

时间:2011-09-12 23:28:26

标签: php ruby

我正在寻找关于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之间的差异)。

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 == -4n == 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名。