PHP 7.2.14 json_decode函数对浮点值进行四舍五入
PHP 7.2.14 json_decode function rounds off the floating point value
我的应用程序收到来自另一个应用程序的 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 位数字。
谢谢
欢迎来到 Whosebug
如果您只想将精度设置为 16 或更高,则应将精度 ini 设置为 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"
我的应用程序收到来自另一个应用程序的 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 位数字。 谢谢
欢迎来到 Whosebug
如果您只想将精度设置为 16 或更高,则应将精度 ini 设置为 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"