Меню

Round php не работает

Проблема с round() Неправильно округляет

tolik777

Новичок

Проблема с round() Неправильно округляет

На сервере под Осью Fedora Core 4 выводит результат 0.36.
На локалке под WinXP SP2 выводит правильный результат 0.37.
Ни чего непойму.

Забыл сказать и там и там PHP4.

hermit_refined

Отшельник

Ничего удивительного. Вещественные числа — это вам не игрушки.

В исходниках PHP 5.1.6 и 4.4.4 есть такая замечательная вещь:

tolik777

Новичок
Новичок

tolik777

Новичок

В чейнжлоге 4.4.4 и 4.4.3 я не нашел чего-нибудь, что касается функции round().

Skubent

Новичок

tolik777

Новичок
Новичок

> округления — зависят
Интересно, почему, если эта операция выполняется процессором, а не реализуется программно, если я не ошибаюсь.

> Какой выход посоветуете?

tolik777

Новичок

hermit_refined

Отшельник

даёт верные 0.37. Чего-то, видимо, я не учитываю, но факт остаётся фактом — их же тесты проваливаются:

SiMM
Это связано не с форматом, а с реализацией pow (т.е. логарифма + эскпоненты). К слову сказать — они там прежде проверку через config.m4 делают, тот кусок, что я привёл — подстраховка.

Добиться предсказуемости у них не вышло, да в общем понятно, что не таким путём её надо добиваться. Что-то они курили, когда это писали.

tolik777
Нормальной программе должно быть пофигу, ведь это же всё-таки округление. Если же вам принципиально — добавляйте что-нибудь очень маленькое.

tolik777

Новичок

hermit_refined

Отшельник

tolik777
Значит, вы что-то не то делаете, вам надо поменять схему вычислений. С вещественными числами нужно быть очень осторожным, и в то же время — понимать, что если вы в результате вычислений получили что-то похожее на 0.365, то в действительности — там может быть нечто другое, 0.364999999999997 или 0.365000000000001, так что округление здесь не принципиально.

Потеря идёт из-за округлений как таковых, вне зависимости от того, «правильны» ли они в вышеупомянутом смысле. Поэтому вам необходимо минимизировать их количество, и сделать их «согласованными».

tolik777

Новичок

Продвинутый новичок

Просто округление надо производить на промежуточных шагах:

Неправильно:
$cost[1]=$price[1]*$qty[1];
$cost[2]=$price[2]*$qty[2];
$cost[3]=$price[3]*$qty[3];
$total= round($cost[1]+$cost[2]+$cost[3],2);

Правильно:
$cost[1]=round($price[1]*$qty[1],2);
$cost[2]=round($price[2]*$qty[2],2);
$cost[3]=round($price[3]*$qty[3],2);
$total= $cost[1]+$cost[2]+$cost[3];

А как это округление производится — совершенно без разницы.

Gorynych

Посетитель PHP-Клуба

на всякий случай, о следующих версиях PHP:

WinXP, PHP 5.1.2 — 0,37
FreeBSD, PHP 5.1.3 — 0,37

Источник

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

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

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

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

Решение

И я получил: 9.779999999999999

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

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

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

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

Читайте также:  Как настроить mmi audi

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

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

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

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

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

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

Источник

PHP Round() not working properly

I need help. I’m doing this:

And this is the number I’m getting: 9.779999999999999€

With the other variables it works just fine, any idea how to fix this?

8 Answers 8

And I got: 9.779999999999999

I believe it’s something in php.ini as @MarkBaker said.. But, I fixed it by doing:

And I got exactly what I wanted. Thanks guys for the help!

what problem I encounter is that round(18.203,2) = 18.2 ,then json_encode(. ) = 18.199999999 . so I find the solution is json_encode(strval(round(18.203,2))) = 18.2 it works

Just join empty string before round function like

something (could be in some 3rd party code ?) set your ini setting precision to 16

Although OP solved his issue, I saw this while searching for other (but similar) issue.

If you came here with a problem where PHP’s round() function is misbehaving (i.e. round(1.4447, 2) will output 1.44 instead of 1.45 ) that’s because round looks just 1 decimal position away from the needed precision, here’s a small recursive helper function that solves the issue:

  • In example above, it starts rounding from 5th decimal point ( 0 ) in this case since not stated otherwise.
  • You can call the function like roundFloat(1.4447, 2, 15) with same outcome for given float 1.4447 .
  • $startAt just defines the starting point for the «rounding process» or the required precision.

Note: all programming languages have issues with writing some floats precisely (has to do with binary, google that for more info).

Источник

Round php не работает

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Читайте также:  Bepinexpack valheim не работает

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Источник

round — Округляет число типа float

(PHP 4, PHP 5, PHP 7)

round — Округляет число типа float

Описание

Возвращает округлённое значение val с указанной точностью precision (количество цифр после запятой). Последняя может быть отрицательной или нулём (по умолчанию).

Замечание: PHP по умолчанию не может правильно обрабатывать строки типа «12,300.2». Для подробностей см. Преобразование строк в числа.

Список параметров

Значение для округления

Читайте также:  Ретранслятор xiaomi mi wifi repeater как настроить

Количество десятичных знаков, до которых округлять

Используйте одну из этих констант для задания способа округления.

Константа Описание
PHP_ROUND_HALF_UP Округляет val в большую сторону от нуля до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 2 и -1.5 в -2.
PHP_ROUND_HALF_DOWN Округляет val в меньшую сторону к нулю до precision десятичных знаков, если следующий знак находится посередине. Т.е. округляет 1.5 в 1 и -1.5 в -1.
PHP_ROUND_HALF_EVEN Округляет val до precision десятичных знаков в сторону ближайшего четного знака.
PHP_ROUND_HALF_ODD Округляет val до precision десятичных знаков в сторону ближайшего нечетного знака.

Возвращаемые значения

Примеры

Пример #1 Пример использования round()

Пример #2 Примеры использования параметра mode

echo round ( 9.5 , 0 , PHP_ROUND_HALF_UP ); // 10
echo round ( 9.5 , 0 , PHP_ROUND_HALF_DOWN ); // 9
echo round ( 9.5 , 0 , PHP_ROUND_HALF_EVEN ); // 10
echo round ( 9.5 , 0 , PHP_ROUND_HALF_ODD ); // 9

echo round ( 8.5 , 0 , PHP_ROUND_HALF_UP ); // 9
echo round ( 8.5 , 0 , PHP_ROUND_HALF_DOWN ); // 8
echo round ( 8.5 , 0 , PHP_ROUND_HALF_EVEN ); // 8
echo round ( 8.5 , 0 , PHP_ROUND_HALF_ODD ); // 9
?>

Пример #3 Примеры использования параметра mode с указанием точности

/* Использование PHP_ROUND_HALF_UP с точностью до 1 знака */
echo round ( 1.55 , 1 , PHP_ROUND_HALF_UP ); // 1.6
echo round ( 1.54 , 1 , PHP_ROUND_HALF_UP ); // 1.5
echo round (- 1.55 , 1 , PHP_ROUND_HALF_UP ); // -1.6
echo round (- 1.54 , 1 , PHP_ROUND_HALF_UP ); // -1.5

/* Использование PHP_ROUND_HALF_DOWN с точностью до 1 знака */
echo round ( 1.55 , 1 , PHP_ROUND_HALF_DOWN ); // 1.5
echo round ( 1.54 , 1 , PHP_ROUND_HALF_DOWN ); // 1.5
echo round (- 1.55 , 1 , PHP_ROUND_HALF_DOWN ); // -1.5
echo round (- 1.54 , 1 , PHP_ROUND_HALF_DOWN ); // -1.5

/* Использование PHP_ROUND_HALF_EVEN с точностью до 1 знака */
echo round ( 1.55 , 1 , PHP_ROUND_HALF_EVEN ); // 1.6
echo round ( 1.54 , 1 , PHP_ROUND_HALF_EVEN ); // 1.5
echo round (- 1.55 , 1 , PHP_ROUND_HALF_EVEN ); // -1.6
echo round (- 1.54 , 1 , PHP_ROUND_HALF_EVEN ); // -1.5

/* Использование PHP_ROUND_HALF_ODD с точностью до 1 знака */
echo round ( 1.55 , 1 , PHP_ROUND_HALF_ODD ); // 1.5
echo round ( 1.54 , 1 , PHP_ROUND_HALF_ODD ); // 1.5
echo round (- 1.55 , 1 , PHP_ROUND_HALF_ODD ); // -1.5
echo round (- 1.54 , 1 , PHP_ROUND_HALF_ODD ); // -1.5
?>

Список изменений

Версия Описание
5.3.0 Был добавлен параметр mode .
5.2.7 Работа функции round() была изменена в соответствии со стандартом C99.

Смотрите также

  • ceil() — Округляет дробь в большую сторону
  • floor() — Округляет дробь в меньшую сторону
  • number_format() — Форматирует число с разделением групп

Источник

Adblock
detector