PHP 7.2.14 json_decode函数对浮点值进行四舍五入

PHP 7.2.14 json_decode函数对浮点值进行四舍五入,php,json-deserialization,Php,Json Deserialization,我的应用程序接收来自另一个应用程序的JSON请求,最大浮点数为18位。现在,当我尝试解码JSON请求数据时,数字大于12的浮点值将舍入到最大12位,但我的应用程序应该需要处理请求,并以与此值用于验证请求真实性相同的精度处理浮点值 { "value2": 12.2256, "value": 18.4446359017678 } 在JSON_解码转换为 array("value" => 18.444635901768, "

我的应用程序接收来自另一个应用程序的JSON请求,最大浮点数为18位。现在,当我尝试解码JSON请求数据时,数字大于12的浮点值将舍入到最大12位,但我的应用程序应该需要处理请求,并以与此值用于验证请求真实性相同的精度处理浮点值

{
"value2": 12.2256,
"value": 18.4446359017678
}
在JSON_解码转换为

array("value" => 18.444635901768, "value2" => 12.2256)
。 请告知,因为我已经使用了ini_集合(“精度”18),但它将所有浮点数转换为18位。
谢谢

欢迎来到StackOverFlow


如果只想将精度设置为16或更高,则应将精度ini设置为16。但请注意,如果您将specify精度设置为大于16,并且浮点数小于17,php会确保将浮点数转换为17位数字。例如:

ini_set('precision', 17);
$json = '{"value":16.1}';
$json = json_decode($json, true);
var_dump($json['value']); // value convert from float(16.1) to float(16.100000000000001)
此问题的最佳解决方案是禁用精度,将-1置于精度ini:

ini_set('precision', -1);
$json = '{"value":18.4446359017678}';
$json = json_decode($json, true);
var_dump($json['value']); // float(18.4446359017678)
但还有一个简单的解决方案,就是将浮点数类型转换为字符串。当数字类型为字符串时,浮点数字的php进程将被禁用:

$json = '{"value":"18.4446359017678"}';
$json = json_decode($json, true);
var_dump($json['value']); // string(16) "18.4446359017678"

18.4446359017678 != 18.444635901768 18.4446359017678值四舍五入为18.444635901768{78}到{8}。在上面的示例中,12位浮点的XXXXXXXXXX 78四舍五入为.XXXXXXXXXX 8。我无法更新请求数据格式,因为它超出了我的能力范围。“我无法更新请求数据格式,因为它超出了我的能力范围”我告诉第四条路,以备下次您遇到此问题。祝你好运