json_encode添加了许多十进制数字

时间:2017-01-24 09:50:37

标签: php

为什么会这样?我可以阻止这个吗? (除了将它们作为字符串传递)

var_dump(json_encode([1002.31, 2002.42]));

输出:

string(39) "[1002.3099999999999,2002.4200000000001]"

2 个答案:

答案 0 :(得分:2)

这是由于浮点不准确而发生的,因为它们不能直接用二进制表示。 一个解释其中一些is here的网站。

快速修复可能是将它们作为字符串传递并在另一端将它们转换回来,或者将它们乘以整数然后再转换回另一端。

可悲的是,没有真正的解决方法。对于这种行为。

答案 1 :(得分:1)

您应该配置' precision'和' serialize_precision' PARAMS。

precision = 14
serialize_precision = -1

测试用例:

php -r 'var_dump(json_encode([1002.31, 2002.42]));'
string(39) "[1002.3099999999999,2002.4200000000001]"

php -r 'ini_set("precision", 14); ini_set("serialize_precision", -1); var_dump(json_encode([1002.31, 2002.42]));'
string(17) "[1002.31,2002.42]"