PHP BIGINT表示

时间:2013-10-22 22:44:58

标签: php floating-point bigint php-ini

我正在尝试使用BIGINT值的PHP表示(这是表中的键),并测试PHP如何处理大数字作为字符串/浮点值我编写了一个小测试:

<?php
 echo "PHP_INT_MAX=".PHP_INT_MAX."\n"; 
 $x = "9223372036854775107";
 echo "Defining x as : 9223372036854775107\n";
 $y = floatval($x);
 echo "float of x: ".$y."\n";
 echo "float to string using strval: ".strval($y)."\n";
 echo "float to string using sprintf: ".sprintf( "%.0f", $y)."\n";
?>

所以我对输出感到好奇:

PHP_INT_MAX=9223372036854775807
Defining x as : 9223372036854775107
float of x: 9.2233720368548E+18
float to string using strval: 9.2233720368548E+18
float to string using sprintf: 9223372036854774784

那么为什么我会得到不匹配的值? (php.ini文件中的精度= 14)

1 个答案:

答案 0 :(得分:1)

所有关于浮动类型。 PHP使用常见的标准IEEE 754

浮点大小为64.在64系统上,整数大小也是64。

但是没有小数部分且没有精度损失的最大浮点数是9007199254740991.由于存储浮点数的格式,数字超过了它们的精度。

  

在2 ^ 52 = 4,503,599,627,370,496和2 ^ 53 = 9,007,199,254,740,992之间,可表示的数字正好是整数。对于下一个范围,从2 ^ 53到2 ^ 54,一切都乘以2,因此可表示的数字是偶数,等等。相反,对于之前的范围从2 ^ 51到2 ^ 52,间距是0.5等等。

     

作为2 ^ n到2 ^ n + 1范围内的数字的一部分的间距是2 ^ n-52。将数字舍入到最接近的可表示的数字(机器epsilon)时的最大相对舍入误差因此为2 ^ -53。

Double-precision floating-point format