首页 > 解决方案 > PHP 7.2.14 json_decode 函数对浮点值进行四舍五入

问题描述

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

{
"value2": 12.2256,
"value": 18.4446359017678
}

JSON_DECODE 转换为

array("value" => 18.444635901768, "value2" => 12.2256)

. 请告知,因为我已经使用了 ini_set('precision' 18) 但它将所有浮点数转换为 18 位数字。谢谢

标签: phpjson-deserialization

解决方案


欢迎来到 StackOverFlow


如果您只想将精度设置为 16 或更高,则应将精度设置为 16。但请注意,如果您设置的特定精度超过 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"

推荐阅读