математика — PHP Round () не работает должным образом

Мне нужна помощь. Я делаю это:

round($myvar,2);

И это число, которое я получаю: 9,779999999999999 €

С другими переменными все работает нормально, есть идеи, как это исправить?

5

Решение

Я сделал это:

<?php echo round(9.7752,2);?>

И я получил: 9.779999999999999

Я думаю, что это что-то в php.ini, как сказал @MarkBaker.
Но я исправил это, выполнив:

<?php echo number_format($myvar,2);

И я получил именно то, что хотел.
Спасибо ребята за помощь!

8

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

Хотя ОП решил его проблему, я видел это во время поиска другой (но похожей) проблемы.

Если вы пришли сюда с проблемой, где PHP round() функция плохо себя ведет (т.е. round(1.4447, 2) будет выводить 1.44 вместо 1.45) это потому, что round просматривает только одну десятичную позицию от необходимой точности, вот небольшая рекурсивная вспомогательная функция, которая решает проблему:

function roundFloat($float, $neededPrecision, $startAt = 7)
{
if ($neededPrecision < $startAt) {
$startAt--;
$newFloat = round($float, $startAt);
return roundFloat($newFloat, $neededPrecision, $startAt);
}

return $float;
}

Пример использования:

roundFloat(1.4447, 2, 5); // Returns 1.45

Объяснение:

  • В приведенном выше примере он начинает округлять с 5-й десятичной точки (0) в данном случае, поскольку не указано иное.
  • Вы можете вызвать функцию как roundFloat(1.4447, 2, 15) с тем же
    результат для данного поплавка 1.4447,
  • $startAt просто определяет начальную точку для «процесса округления» или требуемую точность.

Примечание: у всех языков программирования есть проблемы с написанием некоторых чисел с плавающей точкой (имеет отношение к двоичному, google это для получения дополнительной информации).

Надеюсь, это поможет кому-то.

1

что-то (может быть в каком-то стороннем коде?) установить настройки ini precision в 16

$php -a
php > echo ini_get("precision");
14 // default
php > echo round(9.7752,2);
9.78

php > echo ini_set("precision", 16);
14
php > echo round(9.7752,2);
9.779999999999999
1

с чем я сталкиваюсь, так это то, что раунд (18.203,2) = 18,2, затем json_encode (…) = 18.199999999.
поэтому я нахожу решение json_encode (strval (round (18.203,2))) = 18.2
оно работает

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