我有一个filter_var_array函数的问题,特别是'FILTER_VALIDATE_FLOAT'标志,它会返回带有太多小数位的浮点数
代码优先:
if (property_exists($this->rawRequest, $varName)) {
$res = filter_var_array($this->rawRequest->$varName, FILTER_VALIDATE_FLOAT);
}
这是我的代码,我在其中验证通过JSON从客户端收到的参数 rawRequest是一个stdClass,如下所示(使用var_export打印):
stdClass::__set_state(
array(
'Action' => 'CreateObject',
'Template' => 'none',
'LatLng' => array (
0 => '48.14914653539144',
1 => '11.577623201171932',
)
)
使用filter_var_array过滤'LatLng'参数后,结果如下所示:
'LatLng' => array (
0 => 48.149146535391433732957206666469573974609375,
1 => 11.5776232011719315551090403459966182708740234375,
)
为什么会这样?
我甚至无法使用round(),类型转换为浮点数,字符串和返回浮点数来修复此问题,我试图减去0.00000001然后再次添加0.00000001,没有任何帮助
更新:
我在同一台机器上编写了以下小测试脚本,同样的apache服务器:
<?php
$test = '48.158308230848306';
$test2 = (float) $test;
$test3 = floatval($test);
echo($test2);
echo('<br />');
echo($test3);
exit(0);
输出在这里:
48.158308230848
48.158308230848
这就是我的期望 我用我的prod代码重新测试它并使用floatval()和类型转换来浮动,但它不起作用。我不知道,唯一的区别是在prod代码中输入来自json,我使用以下代码解析它:
json_decode(file_get_contents('php://input'))
答案 0 :(得分:0)
所以,我终于找到了问题的答案
问题从来不是filter_var_array()
函数,实际上,问题发生的时间要早得多
通过file_get_contents("php://input")
检索POST参数后,一切都还可以
但是当我用json_decode()
解码返回的字符串时,浮点值在此过程中被序列化,从而产生更高的精度。
我找到了两种方法来解决&#34;这个:
希望这可以帮助别人,也许这已经是常识了,但我正在撕扯我的头发。