【发布时间】:2017-08-16 07:46:34
【问题描述】:
这不是一个问题,因为它更多的是要注意。我将使用 json_encode() 的应用程序更新到 PHP7.1.1,我看到浮点数被更改为有时会扩展到 17 位的问题。根据文档,PHP 7.1.x 在编码双精度值时开始使用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"
}
},
【问题讨论】:
-
ini_set('serialize_precision', 14); ini_set('precision', 14);可能会让它像以前一样序列化,但是如果你真的依赖浮点数的特定精度,你就做错了。 -
“如果有人知道这个问题的解决方案”——什么问题?我在这里看不出任何问题。如果您使用 PHP 解码 JSON,您将返回您编码的值。如果您使用不同的语言对其进行解码,很可能会得到相同的值。无论哪种方式,如果您打印 12 位数字的值,您将返回原始(“正确”)值。您的应用程序使用的浮点数是否需要超过 12 位小数精度?
-
@axiac 472.185 != 472.18500000000006。前后有明显区别。这是对浏览器的 AJAX 请求的一部分,值需要保持原始状态。
-
我试图避免使用字符串转换,因为最终产品是 Highcharts,它不会接受字符串。我认为如果您采用浮点值,将其转换为字符串,将其发送出去,然后让 javascript 使用 parseFloat() 将字符串解释回浮点数,我认为这是非常低效和草率的。不是吗?
-
@axiac 我注意到你是 PHP json_decode() 确实带回了原始浮点值。但是,当 javascript 将 JSON 字符串转换回对象时,它不会像您可能暗示的那样将值转换回 472.185 ......因此出现了问题。我会坚持我正在做的事情。
标签: php json precision php-7.1