PHP 7.3 浮点数计算后的不正确行为
PHP 7.3 float numbers incorrect behavior after calculation
以下在 PHP 7.3.15 中对我来说有一个莫名其妙的行为:
在计算 0.012714 * 100
时,PHP 的值为 1.2714
,但与 json_encode
进行比较后发现实际值不同。
这里是最简单的例子
<?php
var_dump((0.012714 * 100) === 1.2714); # false WHY? Because the real value is 1.2713999999999999
echo json_encode([(0.012714 * 100)]); # results in [1.2713999999999999]
我真的不明白这是怎么回事,这曾经在 PHP 7.0 中完美运行。
我读过 json_encode 和浮点数,但事实并非如此,因为比较也失败了。
奇怪的是,这与完全相同的代码完美地工作,但数字减少了十分之一。
<?php
var_dump((0.12714 * 10) === 1.2714); # true
echo json_encode([(0.12714 * 10)]); # results in [1.2714]
如何恢复旧行为?
这似乎与此 bug report 相关,在 PHP 7.1
之前重新创建行为的一个简单适用的解决方案是简单地将 serialize_precision
值设置为 14
.
<?php
ini_set('serialize_precision', 14);
以下在 PHP 7.3.15 中对我来说有一个莫名其妙的行为:
在计算 0.012714 * 100
时,PHP 的值为 1.2714
,但与 json_encode
进行比较后发现实际值不同。
这里是最简单的例子
<?php
var_dump((0.012714 * 100) === 1.2714); # false WHY? Because the real value is 1.2713999999999999
echo json_encode([(0.012714 * 100)]); # results in [1.2713999999999999]
我真的不明白这是怎么回事,这曾经在 PHP 7.0 中完美运行。
我读过 json_encode 和浮点数,但事实并非如此,因为比较也失败了。
奇怪的是,这与完全相同的代码完美地工作,但数字减少了十分之一。
<?php
var_dump((0.12714 * 10) === 1.2714); # true
echo json_encode([(0.12714 * 10)]); # results in [1.2714]
如何恢复旧行为?
这似乎与此 bug report 相关,在 PHP 7.1
之前重新创建行为的一个简单适用的解决方案是简单地将 serialize_precision
值设置为 14
.
<?php
ini_set('serialize_precision', 14);