[英]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是有符号整数的最大值。
这个
for ($i == 0; $i < 10000; $i++){
应该
for ($i = 0; $i < 10000; $i++)
{
您应该将变量设置为0
而不检查它是否等于0
$number_length
又是什么呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.