PHP增加到10位数10000次得到不准确的结果

时间:2018-05-01 01:11:42

标签: php

我有一个脚本试图将值增加10000次,但在某些数字后它没有正确增加。

$number = 2147480001;
$number_length = 10;
for ($i = 0; $i < 10000; $i++){ 
  $number++;
  $number = sprintf("%0".$number_length."d", $number);
  echo $number."\n";
}

结果返回如下:

...... 2147483645 2147483646 2147483647 -2147483648 -2147483647 -2147483646 ......

我能知道它为什么会突然变成负值吗?

3 个答案:

答案 0 :(得分:2)

您遇到的现象称为integer overflow。您的整数值存储在具有固定大小(32位)的存储器单元中,因此可以在该单元中存储有限范围的整数值(从PHP_INT_MIN到PHP_INT_MAX)。如果你走向边界,事情就会开始破裂。

根据PHP docs

  

如果PHP遇到超出整数类型边界的数字,则会将其解释为float。此外,导致超出整数类型边界的数字的操作将返回浮点数。

     

如果浮点数超出整数的边界(在32位平台上通常为+/- 2.15e + 9 = 2 ^ 31,在除Windows之外的64位平台上为+/- 9.22e + 18 = 2 ^ 63 ),结果是未定义的,因为浮点数没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!

对于一次迭代,您的$number变得大于PHP_INT_MAX常量,因此它将转换为double。之后,您立即将其转换回整数,并获得&#34;未定义的结果&#34;。

答案 1 :(得分:1)

2147483647是有符号整数的最大值。

https://en.wikipedia.org/wiki/2,147,483,647

答案 2 :(得分:0)

这个

for ($i == 0; $i < 10000; $i++){ 

应该是

for ($i = 0; $i < 10000; $i++) {

您应该将变量设置为0,而不是检查它是否等于0

$number_length的内容是什么?