json_encode添加很多十进制数字

the*_*uts 5 php

为什么会这样呢?我可以预防吗?(除了将它们作为字符串传递外)

var_dump(json_encode([1002.31, 2002.42]));
Run Code Online (Sandbox Code Playgroud)

输出:

string(39) "[1002.3099999999999,2002.4200000000001]"
Run Code Online (Sandbox Code Playgroud)

Val*_*sky 8

您应该配置“ precision ”和“serialize_precision”参数。

precision = 14
serialize_precision = -1
Run Code Online (Sandbox Code Playgroud)

测试用例:

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]"
Run Code Online (Sandbox Code Playgroud)

  • 这就是解决方案(`serialize_precision`,`precision` 已经是 14 了)。我应该更新我的 php.ini,因为我读到 -1 是 php 7.1 的默认值 (2认同)
  • 将此添加到代码顶部`ini_set('serialize_precision','-1');` 以阻止此行为 - 在 PHP 7.2 上测试 (2认同)

小智 5

我的快速解决方案。将此行添加到您的 PHP 代码中。

ini_set('serialize_precision','-1');
Run Code Online (Sandbox Code Playgroud)