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

为什么模数运算符在Perl和PHP中的行为不同?,php,perl,operators,modulus,Php,Perl,Operators,Modulus,我有一个PHP函数,它不适用于负数: function isOdd($num) { return $num % 2 == 1; } 但它适用于正数 我有一个Perl例程,它做完全相同的事情,也适用于负数 sub isOdd() { my ($num) = @_; return $num % 2 == 1; } 我在翻译函数时有没有犯错误?还是PHP bug?在PHP中,x%y结果的符号是红利的符号,它是x但是 在Perl中,它是除数的符号,即y 因此,在PHP中,$num%

我有一个PHP函数,它不适用于负数:

function isOdd($num) 
{
   return $num % 2 == 1; 
}
但它适用于正数

我有一个Perl例程,它做完全相同的事情,也适用于负数

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

我在翻译函数时有没有犯错误?还是PHP bug?

在PHP中,
x%y
结果的符号是红利的符号,它是
x
但是
在Perl中,它是除数的符号,即
y

因此,在PHP中,
$num%2
的结果可以是
1
-1
0

因此,修复函数并将结果与
0
进行比较:

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

“不起作用”不是一种解释,我的意思是说它给出了错误的解释results@user640527:在将其与1进行比较之前,您为什么不先查看一下$num%2返回的内容?我的想法是使用abs()。函数isOdd($num){return abs($num)%2==1;}但是为什么呢?这是基础数学。为什么会改变?@user640527:这是语言设计的决定。在我知道的Perl和Ruby返回符号的除法和C,C++,java和PHP返回的股息符号。+ 1(相关文档):“模运算器的结果与红利相同的符号-即,一%美元B的结果将有与A $相同的符号。”Python在Perl和Ruby中的工作原理。code>5%2和
-5%2
都返回
1
,而
5%-2
-5%-2
都返回
-1
。观察:
perl-e'@langs=(“perl-le”、“ruby-le”、“python-c”);对于$divident(“+5”,“-5”){for$divident(“+2”,“-2”){for$lang(@langs){$cmd=“$lang\047print$divident%$divident\047”;print“$cmd\t=>”;“system$cmd}print”\n“}}”