Мне нужна помощь. Я делаю это:
round($myvar,2);
И это число, которое я получаю: 9,779999999999999 €
С другими переменными все работает нормально, есть идеи, как это исправить?
Я сделал это:
<?php echo round(9.7752,2);?>
И я получил: 9.779999999999999
Я думаю, что это что-то в php.ini, как сказал @MarkBaker.
Но я исправил это, выполнив:
<?php echo number_format($myvar,2);
И я получил именно то, что хотел.
Спасибо ребята за помощь!
Хотя ОП решил его проблему, я видел это во время поиска другой (но похожей) проблемы.
Если вы пришли сюда с проблемой, где 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
Объяснение:
0
) в данном случае, поскольку не указано иное. roundFloat(1.4447, 2, 15)
с тем же1.4447
, $startAt
просто определяет начальную точку для «процесса округления» или требуемую точность.Примечание: у всех языков программирования есть проблемы с написанием некоторых чисел с плавающей точкой (имеет отношение к двоичному, google это для получения дополнительной информации).
Надеюсь, это поможет кому-то.
что-то (может быть в каком-то стороннем коде?) установить настройки 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
с чем я сталкиваюсь, так это то, что раунд (18.203,2) = 18,2, затем json_encode (…) = 18.199999999.
поэтому я нахожу решение json_encode (strval (round (18.203,2))) = 18.2
оно работает