带浮点数的filter_var_array导致结果

时间:2017-03-17 07:20:08

标签: php floating-point precision floating-accuracy

我有一个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'))

1 个答案:

答案 0 :(得分:0)

所以,我终于找到了问题的答案

问题从来不是filter_var_array()函数,实际上,问题发生的时间要早​​得多 通过file_get_contents("php://input")检索POST参数后,一切都还可以 但是当我用json_decode()解码返回的字符串时,浮点值在此过程中被序列化,从而产生更高的精度。

我找到了两种方法来解决&#34;这个:

  • 更改&#34; serialize_precision&#34; php.ini中的参数(我的默认为100,将其设置为与我的&#34相同;精度&#34;参数成功)
    不推荐这种方法,因为更改此参数的效果可能在其他地方造成破坏性
  • 将浮动请求括在引号中 因此,将您的JSON {&#34; test&#34;:48.58495135846}更改为{&#34; test&#34;:&#34; 48.58495135846&#34;} 这可以防止float的序列化,因为它现在实际上是一个字符串

希望这可以帮助别人,也许这已经是常识了,但我正在撕扯我的头发。