filter_var_array с плавающей точкой приводит к слишком большому количеству десятичных разрядов в результате

У меня проблема с функцией 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',
)
)

После того как параметр ‘LatLng’ был отфильтрован с помощью filter_var_array, результат будет выглядеть следующим образом:

'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 () и приведение типов для float, но он НЕ работал. Я не знаю, единственная разница в том, что в коде prod ввод идет как json, и я анализирую его с помощью следующего кода:

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

0

Решение

Итак, я наконец нашел ответ на свою проблему

Проблема никогда не была filter_var_array() Функция, собственно, проблема возникла гораздо раньше.
После получения параметров POST через file_get_contents("php://input") все еще хорошо.
Но когда я декодирую возвращенную строку с json_decode()в этом процессе значения с плавающей запятой сериализуются, что приводит к более высокой точности.

Я нашел два способа «решить» это:

  • Измените параметр «serialize_precision» в php.ini (у меня был по умолчанию 100, установив его так же, как мой параметр «точности» был успешным)
    я НЕ РЕКОМЕНДУЕМ этот подход, так как последствия изменения этого параметра могут быть разрушительными в другом месте
  • Вложите поплавок в запрос в кавычках
    Поэтому измените в своем JSON {«test»: 48.58495135846} на {«test»: «48.58495135846»}
    Это предотвращает сериализацию с плавающей точкой, так как теперь это фактически строка

Надеюсь, это поможет кому-то еще, возможно, это уже общеизвестно, но я рвал на себе волосы по этому поводу.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]