PHP - WAMP 和 Web 服务器上的浮点数精度差异

PHP - float number accuracy difference on WAMP and a web server

我知道 php 浮点数 are not accurate and I know solutions like BCMath and GMP。我在本地 WAMP server 和另一台服务器(使用 Nginx)上测试了以下代码:

$size = 0.0006;
$data = json_encode( array("size" => $size));
var_dump($data);

WAMP 上的输出:

string '{"size":0.0006}' (length=15)

另一台服务器上的输出:

string(31) "{"size":0.00059999999999999995}"

PHP 两台服务器上的版本都是 7.3。为什么我在 WAMP 上得到了预期的结果,而在我的托管服务器上出现了一些问题?有什么我可以修复的配置吗?

您的 WAMP 输出不是由 PHP 本身产生的,而是由 Xdebug third-party extension. More specifically:

产生的

Xdebug replaces PHP's var_dump() function for displaying variables. Xdebug's version includes different colors for different types and places limits on the amount of array elements/object properties, maximum depth and string lengths.

除此之外,浮点值的隐式字符串转换精度为configurable:

$size = 0.0006;
var_dump($size);
ini_set('precision', 18);
var_dump($size);
float(0.0006)
float(0.000599999999999999947)

json_encode() 的情况下,转换是显式的,我们可以在 manual:

中阅读

The encoding is affected by the supplied options and additionally the encoding of float values depends on the value of serialize_precision.

$size = 0.0006;
echo json_encode( array("size" => $size)), PHP_EOL;
ini_set('serialize_precision', 18);
echo json_encode( array("size" => $size)), PHP_EOL;
{"size":0.0006}
{"size":0.000599999999999999947}