【问题标题】:modulus operation gives negative value in php模数运算在php中给出负值
【发布时间】:2013-04-01 09:31:41
【问题描述】:

我期望从以下陈述中得到 768。但它与 -360 相呼应。为什么?

echo 1364808202768%1000;

更新:

#: php -v
PHP 5.3.2-1ubuntu4.17 with Suhosin-Patch (cli) (built: Jun 19 2012 01:35:33) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.0.5, Copyright (c) 2002-2008, by Derick Rethans

#: php -r 'echo 1364808202768%1000;'
-360

#: uname -a
Linux tripura 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux

【问题讨论】:

  • 我已经测试过它的工作正常。
  • 在什么系统上使用什么 PHP 版本? 3v4l.org/fIGtV
  • PHP 5.4.7、XAMPP、Windows:我也收到了-360
  • 值得注意的是,在处理大数时,最值得注意的是使用模运算符,结果取决于您的 CPU 架构。因此,如果您必须执行复杂的数学运算,运行一个体面的 64 位机器将是您的优势。这是一些示例代码 - 您可以比较它在 x86 和 x86_64 机器上的输出:

标签: php modulus


【解决方案1】:

是因为数量超过了整数类型所能容纳的最大值。您可以像这样检查整数是否太大:

var_dump('1364808202768' > PHP_INT_MAX);

内置函数fmod好用,应该可以处理大数:

echo fmod('1364808202768', 1000);

如果由于某种原因 fmod 不可用,或者如果您经常处理大量数字,您也可以使用两个常用扩展名之一(GMPBC):

// Using the GMP extension
$big = gmp_init('1364808202768', 10);
$val = gmp_strval(gmp_mod($big, 1000));
echo $val;

// Using the BC extension
echo bcmod('1364808202768', 1000);

【讨论】:

    【解决方案2】:

    我认为那是因为它超出了 int 限制,请使用 fmod(1364808202768,1000);

    【讨论】:

      【解决方案3】:

      您应该阅读有关数据类型及其范围的信息。使用这个:-

      $num = 1364808202768;
      echo fmod($num,1000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-23
        • 2021-03-20
        • 2011-04-22
        • 2018-08-08
        相关资源
        最近更新 更多