为什么在Perl和PHP中,取模运算符行为不同?

9

我有一个 PHP 函数,无法处理负数:

function isOdd($num) 
{
   return $num % 2 == 1; 
}

但这只适用于正数。

我有一个 Perl 程序可以做完全相同的事情,而且也适用于负数。

sub isOdd()
{
  my ($num) = @_;
  return $num % 2 == 1;
}

我在翻译函数时有没有犯错?或者是PHP的错误?


“不起作用”不是一个解释。 - zerkms
我的意思是它给出了错误的结果。 - user640527
@user640527:为什么你在将其与1进行比较之前,不先查看$num%2返回什么? - zerkms
1
我的想法是使用abs()函数。function isOdd($num) { return abs($num) % 2 == 1; } - user557846
1个回答

21
在PHP中,x % y的结果的符号取决于被除数,即x的符号,但是在Perl中,结果的符号取决于除数,即y的符号。因此,在PHP中,$num % 2的结果可以是1-10。所以请修复您的函数,将结果与0进行比较。
function isOdd($num) { 
  return $num % 2 != 0; 
}

但为什么?这是基本数学。为什么会改变呢? - user640527
3
这是一种语言设计决策。在我所了解的语言中,Perl和Ruby返回除数的符号,而C、C++、Java和PHP返回被除数的符号。 - codaddict
1
+1(相关文档)http://www.php.net/manual/en/language.operators.arithmetic.php:“模数运算符%的结果与被除数具有相同的符号 - 也就是说,$a%$b的结果将与$a具有相同的符号。” - user166390
1
Python在这方面的工作方式类似于Perl和Ruby。5%2-5%2都返回1,而5%-2-5%-2都返回-1注意: perl -e '@langs =(“perl -le”,“ruby -le”,“python -c”); for $dividend(“+5”,“-5”){for $divisor(“+2”,“-2”){for $lang(@langs){$cmd =“$lang \ 047print $dividend%$divisor \ 047”; print“$ cmd \ t=>”;系统$ cmd}打印“\ n”}}}' - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接