gpt4 book ai didi

PHP7.1 json_encode() float 问题

转载 作者:IT老高 更新时间:2023-10-28 12:05:27 26 4
gpt4 key购买 nike

这不是一个问题,因为它更多的是要注意。我将使用 json_encode() 的应用程序更新到 PHP7.1.1,我看到 float 被更改为有时会扩展到 17 位的问题。根据文档,PHP 7.1.x 在编码 double 值时开始使用 serialize_precision 而不是精度。我猜这会导致

的示例值

472.185

成为

472.18500000000006

在该值通过 json_encode() 之后。自从我发现以来,我已经恢复到 PHP 7.0.16,并且不再遇到 json_encode() 的问题。在恢复到 PHP 7.0.16 之前,我还尝试更新到 PHP 7.1.2。

这个问题背后的原因确实源于 PHP - Floating Number Precision ,但是最终所有原因都是因为 json_encode() 中从精度到 serialize_precision 用法的变化。

如果有人知道此问题的解决方案,我将非常乐意听取推理/修复。

摘自多维数组(之前):

[staticYaxisInfo] => Array
(
[17] => stdClass Object
(
[variable_id] => 17
[static] => 1
[min] => 0
[max] => 472.185
[locked_static] => 1
)

)

经过 json_encode()...

"staticYaxisInfo":
{
"17":
{
"variable_id": "17",
"static": "1",
"min": 0,
"max": 472.18500000000006,
"locked_static": "1"
}
},

最佳答案

这让我有点抓狂,直到我终于找到了 this bug指向this RFC其中说

Currently json_encode() uses EG(precision) which is set to 14. That means that 14 digits at most are used for displaying (printing) the number. IEEE 754 double supports higher precision and serialize()/var_export() uses PG(serialize_precision) which set to 17 be default to be more precise. Since json_encode() uses EG(precision), json_encode() removes lower digits of fraction parts and destroys original value even if PHP's float could hold more precise float value.

和(强调我的)

This RFC proposes to introduce a new setting EG(precision)=-1 and PG(serialize_precision)=-1 that uses zend_dtoa()'s mode 0 which uses better algorigthm for rounding float numbers (-1 is used to indicate 0 mode).

简而言之,有一种新方法可以让 PHP 7.1 json_encode 使用新的改进的精度引擎。在 php.ini 您需要将 serialize_precision 更改为

serialize_precision = -1

您可以使用此命令行验证它是否有效

php -r '$price = ["price" => round("45.99", 2)]; echo json_encode($price);'

你应该得到

{"price":45.99}

关于PHP7.1 json_encode() float 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42981409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com