源于这个问题:(Java)How does java do modulus calculations with negative numbers?
强制PHP返回正数51的任何地方?
更新
寻找一个配置设置来修复,而不是猜测
或其他数学函数如bcmath?
更新
不完全相信java答案,因为它没有考虑负模数
-13+(-64) =?
答案 0 :(得分:12)
无论如何,你引用的帖子已经给出了正确答案:
$r = $x % $n;
if ($r < 0)
{
$r += abs($n);
}
其中$ x = -13且$ n = 64。
答案 1 :(得分:6)
计算n个模d。结果总是非负的,d的符号被忽略。
示例:
echo gmp_strval(gmp_mod('-13', '64')); // 51
请注意,n
和d
必须是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)