PHP中-13%64 = -13怎么样?

时间:2010-12-10 13:29:16

标签: php math modulus

源于这个问题:(Java)How does java do modulus calculations with negative numbers?

强制PHP返回正数51的任何地方?

更新
寻找一个配置设置来修复,而不是猜测

或其他数学函数如bcmath?

更新
不完全相信java答案,因为它没有考虑负模数 -13+(-64) =?

4 个答案:

答案 0 :(得分:12)

无论如何,你引用的帖子已经给出了正确答案:

$r = $x % $n;
if ($r < 0)
{
    $r += abs($n);
}

其中$ x = -13且$ n = 64。

答案 1 :(得分:6)

如果GMP可用,您可以使用gmp_mod

  

计算n个模d。结果总是非负的,d的符号被忽略。

示例:

echo gmp_strval(gmp_mod('-13', '64')); // 51

请注意,nd必须是GMP编号资源或数字字符串。其他任何东西都不行¹

echo gmp_strval(gmp_mod(-13, 64));
echo gmp_mod(-13, 64);

将返回-51而不是which is a bug)。

¹ 在此codepad中运行上述内容,将在所有三种情况下生成51。它不会在我的开发机器上那样做。

答案 2 :(得分:4)

模运算应该找到另一个数的除数的余数。但严格来说,在大多数主流编程语言中,如果被除数或/和除数为负数,则模运算会出现故障。这包括PHP, Perl, Python, Java, C, C++, etc.

为什么我说故障?因为根据数学定义, a remainder must be zero or positive

简单的解决方案是自己处理案例:

if r < 0  then r = r + |divisor|;

|除数|是除数的绝对值。

另一种解决方案是使用库(如@Gordon指出)。但是,我不会使用库来处理这样的简单案例。

答案 3 :(得分:0)

PHP manual

  

模数运算符%的结果与被除数具有相同的符号 - 也就是说,$ a%$ b的结果将与$ a具有相同的符号。例如

所以这是不可配置的。使用您链接到

的问题中建议的选项