我正在尝试使用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)
答案 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。