我同意这个
php > var_dump(number_format(10000000000000000000000)); // 10^22
php shell code:1:
string(30) "10,000,000,000,000,000,000,000"
这里发生了什么?
php > var_dump(number_format(100000000000000000000000)); // 10^23
php shell code:1:
string(30) "99,999,999,999,999,991,611,392"
有人可以向我解释一下究竟发生了什么吗?
答案 0 :(得分:2)
这在the documentation中有详细描述:
整数溢出
如果PHP遇到超出integer类型边界的数字,则会将其解释为float。此外,导致超出integer类型范围的数字的操作将返回float。
示例#3 64位系统上的整数溢出
<?php $large_number = 9223372036854775807; var_dump($large_number); // int(9223372036854775807) $large_number = 9223372036854775808; var_dump($large_number); // float(9.2233720368548E+18) $million = 1000000; $large_number = 50000000000000 * $million; var_dump($large_number); // float(5.0E+19) ?>
浮点数无法准确表示许多值。有关详细信息,请参阅Is floating point math broken?。
PHP_INT_MAX
constant显示您的PHP版本支持的最大整数。
答案 1 :(得分:0)
计算机内存有限,因此无法存储无限精确的整数值。您的系统基本上没有空间进行精确的整数估值。
This answer很好地讨论了如何让整数出现在你想要的数字上。
答案 2 :(得分:0)
更改php.ini中的precisiona或使用ini_set并在您的var中应用强制转换
ini_set('precision', 2048);
$number1 = (float) "0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
$number3 = (float) "0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001";
$test1 = (0 == $number1);
$test2 = (0 == $number3);