2017-09-22 56 views
-1

我正在一个PHP应用程序和数学运算导致错误的答案显示错误的结果。所以,我开始挖掘,经过几个小时的努力,我才发现问题。奇怪的模数运算符结果 - PHP

这里是有问题的表达:

echo -1 % 26; 

答案应该是25但它给-1。我不知道,我的表情有什么问题吗?

PHP输出: PHP Output

计算器: Calculator Output

谁能请确定是哪里出了问题?

回答

1

这是预期的行为。 From the PHP manual

的模运算符%的结果具有相同的符号红利 - 也就是$a % $b结果将具有相同的符号$a

如果被除数的符号(中部分在%左侧)变化,结果也会改变。您可以通过添加除数找到负余数的正数等价物。 -1相当于25模数26,因为1 + 26 = 25。

因此,你可以执行以下操作来获得阳性结果:

function modulo($dividend, $divisor) { 
    $result = $dividend % $divisor; 
    return $result < 0 ? $result + $divisor : $result; 
} 

$calculation = modulo(-1, 26); // 25 
$calculation2 = modulo(51, 26); // 25 
+0

这是不是征兆,结果也不同 – Alena

+0

@Alena已答复更新,以说明为什么是这样的话:) – iblamefish

+0

感谢,但我不认为如果是这样的正确的方式来处理它。因为我需要添加额外的检查,如果数字是负数,然后添加它而不是计算模数。 – Alena

0

怎么样?

$ cat test.php 
<?php 

function truemod($num, $mod) { 
    return ($mod + ($num % $mod)) % $mod; 
} 

echo truemod(-1, 26).PHP_EOL; 
?> 

输出

$ php test.php 
25 
+0

它适用于此,但会导致与其他计算问题。但无论如何,谢谢! – Alena