这不是一个问题,因为这更像是一个需要注意的问题.我更新了一个使用json_encode()到PHP7的应用程序.1.1我看到一个问题,浮动被更改为有时扩展到17位.根据文档,PHP7.1.当编码双精度值时,x开始使用serialize_precision而不是精度.我猜这导致了一个例子的价值

472.185

成为

472.18500000000006

在那之后,价值超过了json_encode().自从我发现以来,我已经恢复到PHP 7.0.16,并且我不再有json_encode()的问题.在恢复到PHP 7.0.16之前,我还try 更新到PHP 7.1.2.

这个问题背后的原因确实源于PHP - Floating Number Precision,但最终的原因是json_encode()中从精度到序列化_精度的用法发生了变化.

如果有人知道这个问题的解决方案,我将非常乐意聆听其推理/解决方案.

摘自多维数组(之前):

[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,上面写着

目前json_encode()使用的EG(精度)设置为14.这意味着最多14位数字用于显示(打印)号码.IEEE 754 double支持更高的精度,serialize()/var_export()使用PG(serialize_precision,串行化_precision),默认设置为17以提高精度.由于json_encode()使用EG(精度),所以json_encode()会删除分数部分的较低数字,并 destruct 原始值,即使PHP的float可以保存更精确的float值.

和(强调我的)

本RFC建议引入一个新设置,例如(精度)=-1和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).

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

serialize_precision = -1

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

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

你应该得到

{"price":45.99}

Php相关问答推荐

Laravel迁移返回SQL错误,但SQL有效且工作正常

从产品中获取WooCommerce产品属性单选按钮的列表WP_Query

在ShipStation for WooCommerce中使用自定义订单项目元数据

仅在WooCommerce管理订单视图上显示订单项自定义元数据

在内部API请求之后,在响应客户端之前,是否忘记了PHP中的Header()?

将购买限制在WooCommerce中具有相同产品属性的项目

多行PHP属性声明中是否允许单行注释

htaccess重命名index.php以在URL中显示为SEO的友好名称

隐藏WooCommerce管理子菜单;主页;来自store 经理

Shopware 6 插件:如何删除/迁移布尔配置到多选配置

按类别层次 struct 过滤 Laravel 集合

根据支付网关选项更改 WooCommerce Checkout 上的立即付款按钮文本

Woocommerce注册中的自定义复选框验证错误提示问题

PHP使用三元运算符进行null合并(再次)

php/html OnSubmit 禁用输入类型提交未给出预期结果

PHP删除具有相同键的项目,除了具有最低值的项目

同时执行odbc_execute、odbc_fetch_row和odbc_result

复杂的mysql查询问题

如何在php中获取大于50的年龄

服务器发送的事件:EventSource 抛出 MIME 错误