2017-05-09 103 views
4

PHP似乎有a bug处理json_encode中的十进制精度的方式。如何json_encode在PHP 7.1.1中浮点值?

这很容易通过编码一个简单的浮动看到的只是:

echo json_encode(["testVal" => 0.830]); 

// Prints out: 
{"testVal":0.82999999999999996003197111349436454474925994873046875} 

我没有太大的服务器管理的,所以除了去到php.ini并改变serialize_precision为-1,是有在我的代码中可以做的任何事情来防止这种情况发生,当我无法确定它是否在该设置已更改的环境中运行时?

编辑: 我敢肯定,一些意见将希望链接到为什么浮点不精确存在的一般讨论。我知道。我的问题是关于在PHP中处理它的最佳实践,以及是否有防御性代码的方法。当然,有比将花车作为字符串发送更好的方法。

+0

会发生这种情况在7.0呢? –

+0

正如您关于错误报告的讨论清楚地表明的那样,这不是一个错误,而是一个故意的特征。如果您的服务器配置为高精度地序列化浮点数,那么'json_encode'现在就会尊重这一点。 – IMSoP

+0

如果你将该值写入字符串?那么你有你想要的确切数字。 – Stony

回答

6

您应该配置'precision'和'serialize_precision'参数。

precision = 14 
serialize_precision = -1 

测试用例:

php -r 'ini_set("precision", 14); ini_set("serialize_precision", -1); var_dump(json_encode(["testVal" => 0.830]));' 
string(16) "{"testVal":0.83}" 
+0

链接到[文档更改日志](// php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog)可能会有帮助,它记录了更改的内容。特别是,改变'精度'不再对'json_encode'产生影响。 –

+0

@Justastudent谢谢,这对于7.1来说是真的,很多人仍然使用5.6,所以上面的答案对于使用5.6+的所有人都是有用的。 –

+0

是的,我在我原来的问题中提到过。这是最好的解决方案吗?如果是这样,为什么?有没有其他的选择? – GoldenJoe