12

源自这个问题:(Java)Java如何用负数进行模数计算?

有什么地方可以强制 PHP 返回正数 51?

更新
寻找要修复的配置设置,而不是难以猜测

或其他数学函数,如 bcmath?

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

4

5 回答 5

16

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

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

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

于 2010-12-10T13:34:30.077 回答
7

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

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

例子:

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

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

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

都将返回 -51 (这是一个错误)。

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

于 2010-12-10T13:43:57.520 回答
4

模运算应该找到一个数字除以另一个数字的余数。但严格来说,在大多数主流编程语言中,如果除数或/和除数为负数,模运算就会出错。这包括PHP、Perl、Python、Java、C、C++ 等。

为什么我说故障?因为根据数学定义,余数必须为零或正数

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

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

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

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

于 2011-01-14T11:10:42.710 回答
0

PHP手册

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

所以这是不可配置的。使用您链接到的问题中建议的选项

于 2010-12-10T13:42:24.870 回答
0

if当您可以立即计算时,我讨厌在这种情况下使用。

$r = ($x % $n + $n) % $n;

何时$n为正。

于 2022-02-08T09:39:18.073 回答