PHP中的大数字并不像它们看起来那样

时间:2018-04-25 14:08:48

标签: php

我同意这个

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"

有人可以向我解释一下究竟发生了什么吗?

3 个答案:

答案 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)

Floating point numbers.

计算机内存有限,因此无法存储无限精确的整数值。您的系统基本上没有空间进行精确的整数估值。

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);