当前位置: 首页 > 面试题库 >

PHP7.1 json_encode()浮动问题

葛言
2023-03-14
问题内容

这不是一个问题,因为更多的是要意识到。我更新了一个使用json_encode()PHP7.1.1
的应用程序,然后看到一个问题,即浮点数被更改为有时会扩展到17位数字。根据文档,serialize_precision在对双精度值进行编码时,PHP
7.1.x开始使用而不是精度。我猜这引起了一个示例值

472.185

成为

472.18500000000006

那个价值过去了json_encode()。自发现以来,我已恢复为PHP 7.0.16,不再遇到问题json_encode()。在还原到PHP
7.0.16之前,我还尝试了更新到PHP 7.1.2。

这个问题背后的原因确实来自PHP-浮点数精度,但是最终的所有原因都是由于从精度更改为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"
                }
            },

问题答案:

这让我有点发疯,直到我终于找到此错误,该错误将您指向此RFC,其中说

当前json_encode()使用设置为14的EG(精度)。这意味着最多使用14位数字来显示(打印)该数字。IEEE 754
double支持更高的精度,并且serialize()/var_export()使用默认设置为17的PG(serialize_precision)更加精确。由于json_encode()使用EG(precision),因此json_encode()即使PHP的float可以持有更精确的float值,也除去了小数部分并破坏了原始值。

和(强调我的)

该RFC建议引入一个新设置EG(precision)=-1和PG(serialize_precision)=-1,该设置使用zend_dtoa()的模式0,该模式使用更好的算法对舍入浮点数进行取整(-1用于指示0模式)

简而言之,有一种使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}


 类似资料:
  • 我有以下值给出了错误的总数。 当我用计算器计算上述值时,它给出了我预期的结果,而javascript给出了我意想不到的结果。为什么和什么是解决方案才能得到预期的结果?

  • 主要内容:清除浮动浮动可以使一个元素脱离自己原本的位置,并在父元素的内容区中向左或向右移动,直到碰到父元素内容区的边界或者其它浮动元素为止。另外,在浮动元素之后定义的文本或者行内元素都将环绕在浮动元素的一侧,从而可以实现文字环绕的效果,类似于 Word 中图文混排。 注意:浮动(float)属性仅对非绝对定位的元素有效,跟随浮动元素的文本或行内元素将围绕在浮动元素的另一侧,例如向左浮动的话其它元素将围绕在浮动元素的

  • 本文最初发表于博客园,并在GitHub上持续更新。以下是正文。 文本主要内容 标准文档流 标准文档流的特性 行内元素和块级元素 行内元素和块级元素的相互转换 浮动的性质 浮动的清除 浏览器的兼容性问题 浮动中margin相关 关于margin的IE6兼容问题 标准文档流 宏观地讲,我们的web页面和photoshop等设计软件有本质的区别:web页面的制作,是个“流”,必须从上而下,像“织毛衣”。

  • CSS中,通过 float属性,任何元素都可以浮动,取值 left 让一个元素向左浮动,取值 right 则向右浮动。 浮动会影响包含块中的布局,如果一个包含块中存在浮动框,则先让所有的框按照普通流中的位置摆放,再将浮动框从文档流中取出来,并让浮动框从包含块的顶部开始,根据浮动方向一个接一个地水平排列。 浮动元素的包含块,是它最近的块级祖先元素(或表格单元格、或行内块祖先元素)的内容边界。向左浮动

  • 我正在努力解决一个浮点数问题,其中var变化返回为0.0999循环,我需要返回0.01(一便士)。由于这个问题,代码运行良好,除了最后一分钱。这是我在这里的第一个帖子,所以请原谅格式... 提前道谢!

  • 问题内容: 是否曾经有过两个浮点值之间的比较()如果将它们进行比较而返回但将它们与FLOAT进行比较而返回的情况? 作为小组项目的一部分,我正在编写一些过程来比较任何给定类型的两个数值。这里是4种我不得不应付干脆:,,和。因此,我想将一个函数分组并归为一个函数,也就是将任何一个都进行转换并进行比较。 这会导致任何不正确的结果吗? 谢谢。 问题答案: 如果将双精度型转换为浮点型,并且它们之间的差异超