【问题标题】:How is -13 % 64 = -13 in PHP?PHP 中的 -13 % 64 = -13 怎么样?
【发布时间】:2011-05-23 11:55:41
【问题描述】:

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

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

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

或者像 bcmath 这样的其他数学函数?

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

【问题讨论】:

  • 更新...寻找解决方案而不使用硬猜测方法
  • 没有配置设置来改变 PHP 中数学的工作方式。如果有那么它可能会破坏 PHP,我想它会在内部使用大量计算
  • 这不是预期的算法。令人惊讶的是 Python 和 Perl 接受它,但 PHP 不接受。使用解决方法。顺便说一句,fmod()bcmod()gmp_mod() 也不要。

标签: php math modulus


【解决方案1】:

不管怎样,你引用的帖子已经给出了正确答案:

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

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

【讨论】:

  • 是否有模数的配置,而不是自己猜?
  • 不涉及猜测,只是计算您已经在做什么(哇)。
  • if 最好是while
  • @mario 使用while 并没有什么坏处,但是由于模数的性质,$r 永远不会
  • while 不是必须的,但是将 n 的绝对值添加到 r 而不仅仅是 n 也可以解决 n 为负的情况。
【解决方案2】:

如果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。它不会在我的开发机器上这样做。

【讨论】:

  • 我真的不会为此使用 GMP 库。实在是太重量级了。 Spiny Norman 下面的答案要好得多。
【解决方案3】:

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

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

简单的解决办法是自己处理:

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

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

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

【讨论】:

    【解决方案4】:

    PHP manual 这么说

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2013-07-11
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多