2015-10-19 3 views
3

Мне нужна помощь. Я делаю это:PHP Round() не работает должным образом

round($myvar,2); 

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

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

+0

Что еще вы делаете после округления? Как вы показываете это значение? –

+0

'round ($ myvar, 2)' не производит никакого вывода, возможно, вы делаете какие-то 'echo' или' print', покажите нам полный код –

+0

Я просто использую echo ...

ответ

4

Я сделал это:

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

И я получил: +9,779999999999999

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

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

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

+0

'ini_set (« precision », 12);' также должно работать, редактирование php.ini облегчило бы это. –

+0

Это похоже на нормальную [неточность с плавающей запятой] (http://stackoverflow.com/questions/3726721/php- math-precision) мне ... –

+0

Хорошо, спасибо за помощь, в следующий раз я буду знать, что делать, исправил (Y) –

1

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

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

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

'round (1.4447, 2)' -should- return 1.44; то есть ближайший 2-десятичный разрядный поплавок. –

Смежные вопросы