0

我正在尝试使用 PHP 表示 BIGINT 值(它们是表中的键),并测试 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)

4

1 回答 1

2

这都是关于浮点类型的。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 , ETC。

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

双精度浮点格式

于 2013-10-23T00:41:38.650 回答