Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带浮点数的filter_var_数组导致结果中小数位数过多_Php_Floating Point_Precision_Floating Accuracy - Fatal编程技术网

Php 带浮点数的filter_var_数组导致结果中小数位数过多

Php 带浮点数的filter_var_数组导致结果中小数位数过多,php,floating-point,precision,floating-accuracy,Php,Floating Point,Precision,Floating Accuracy,我对filter\u var\u数组函数有一个问题,特别是“filter\u VALIDATE\u FLOAT”标志,它返回的浮点小数位数太多 代码优先: if (property_exists($this->rawRequest, $varName)) { $res = filter_var_array($this->rawRequest->$varName, FILTER_VALIDATE_FLOAT); } 这是我的代码,在这里我验证通过JSON从客户机收到的参

我对filter\u var\u数组函数有一个问题,特别是“filter\u VALIDATE\u FLOAT”标志,它返回的浮点小数位数太多

代码优先:

if (property_exists($this->rawRequest, $varName)) {
    $res = filter_var_array($this->rawRequest->$varName, FILTER_VALIDATE_FLOAT);
}
这是我的代码,在这里我验证通过JSON从客户机收到的参数
rawRequest是一个stdClass,如下所示(使用var_export打印):

使用filter_var_数组过滤“LatLng”参数后,结果如下所示:

'LatLng' => array (
    0 => 48.149146535391433732957206666469573974609375,
    1 => 11.5776232011719315551090403459966182708740234375,
)
为什么会发生这种情况

我甚至不能用round()来解决这个问题,将类型转换为float,将字符串转换为float,然后再返回float,我尝试减去0.00000001,然后再加上0.00000001,没有任何帮助

更新:
我在同一台机器、同一台apache服务器上编写了以下小测试脚本:

<?php

$test = '48.158308230848306';
$test2 = (float) $test;
$test3 = floatval($test);

echo($test2);
echo('<br />');
echo($test3);
exit(0);
这就是我所期望的
我用prod代码重新测试了它,并使用floatval()和类型转换来浮动,但它不起作用。我不知道,唯一的区别是,在prod代码中,输入是json,我用以下代码对其进行解析:

json_decode(file_get_contents('php://input'))

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

问题从来不是
filter\u var\u array()
通过
文件获取内容(“php://input)
一切正常。
但是,当我使用
json\u decode()
解码返回的字符串时,浮点值在此过程中被序列化,从而获得更高的精度

我找到了两种“解决”这个问题的方法:

  • 更改php.ini中的“serialize_precision”参数(我的默认值为100,将其设置为与我的“precision”参数相同,成功)
    不建议使用此方法,因为更改此参数可能会在其他地方造成灾难性影响
  • 在请求中用引号括起浮点数
    因此,将JSON{“test”:48.58495135846}更改为{“test”:“48.58495135846”}
    这将阻止浮点的序列化,因为它现在实际上是一个字符串

希望这对其他人有帮助,也许这已经是常识了,但我对此非常恼火。

浮点数就是这么做的。如果要将48.14914653539144存储为浮点值,则无法准确存储该值,而是会得到另一个数字。复制的,但是,仔细看看你的数字,这些复制正确吗?因为您的输出数字与输入数字非常不同,超出了正常浮点表示错误的预期。哦,不,对不起,修复了数字,它们来自不同的测试。我不认为这是重复的,我很清楚这个问题。我准备好听听如何解决我的问题了,因为filter_var_数组只是破坏了我的字符串输入,之后我什么也没做就修复了这个奇怪的浮点输出。我知道浮点数只是小数的近似值,我知道,但我如何将其取整?
48.158308230848
48.158308230848
json_decode(file_get_contents('php://input'))