我正在试验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表示)
发布于 2013-10-23 00:41:38
都是浮子型的。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。
双精度浮点格式
https://stackoverflow.com/questions/19529701
复制相似问题