繁体   English   中英

PHP递增到10位数字10000次获得不正确的结果

[英]PHP increment to 10 digits number for 10000 times get inaccurate results

我有一个脚本尝试将值增加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 ......

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

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

根据PHP文档

如果PHP遇到一个超出整数类型范围的数字,它将被解释为浮点数。 同样,导致数字超出整数类型范围的运算将改为返回浮点数。

如果浮点数超出整数的范围(在32位平台上通常为+/- 2.15e + 9 = 2 ^ 31,而在Windows以外的64位平台上通常为+/- 9.22e + 18 = 2 ^ 63),由于浮点数的精度不足以提供精确的整数结果,因此结果是不确定的。 没有警告,发生这种情况时甚至不会发出通知!

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

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

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

这个

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

应该

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

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

$number_length又是什么呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM