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

Функция вокруг PHP не работает правильно

Функция php round не работает правильно. У меня есть номер 0.9950 , Я поставил код:

И я получаю 1,0? Зачем?? Почему я не могу получить 0.99 ?

2 ответа

Вы можете добавить третий параметр в функцию, чтобы она делала то, что вам нужно. Вы должны выбрать один из следующих:

  • PHP_ROUND_HALF_UP
  • PHP_ROUND_HALF_DOWN
  • PHP_ROUND_HALF_EVEN
  • PHP_ROUND_HALF_ODD

Эти константы достаточно просты для понимания, поэтому просто используйте адаптированную:) В вашем примере, чтобы получить 0,99, вам нужно использовать:

Только что протестировал в PHP Sandbox. PHP иногда кажется забавным.

Когда вы вокруг 0.9950 до двух знаков после запятой, вы получите 1.00 потому что так работает округление. Если вы хотите операцию, которая приведет к 0.99 тогда, возможно, вы ищете усечение с плавающей запятой. Один из вариантов усечения числа с плавающей запятой до двух десятичных знаков — умножить на 100, привести к целому числу, а затем снова разделить на 100:

$num = "0.9950"; $output = (int)(100*$num) / 100; echo $output; 0.99 

Этот трюк работает, потому что после первого шага 0.9950 становится 99.50 , который, когда приведен к целому числу становится просто 99 , отбрасывая все после второго знака после запятой в исходном числе. Затем мы снова делим на 100 чтобы восстановить исходное число, минус то, что мы хотим обрезать.

Читайте также:  Java dependency injection inject

Источник

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

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

Решение

И я получил: 9.779999999999999

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

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

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

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

Если вы пришли сюда с проблемой, где 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 это для получения дополнительной информации).

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

что-то (может быть в каком-то стороннем коде?) установить настройки 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
оно работает

Источник

PHP: Почемгу round некорректно округляет до двух знаков?

Inkognitoss

Сработал именно ваш вариант с ini_set . Причем по чудному. Мне нужно было обработать массив с подобными числами 8.9999999999999 . Так вот, если просто прописать в начале скрипта ini_set(«precision», 12); , как по сути и написано в мане «. Опция конфигурации будет сохранять это новое значение в процессе выполнения скрипта и восстановится по окончании работы скрипта. » , то не работает. А если поставить ini_set(«precision», 12); в цикле перед каждым round , тогда все ок.

Inkognitoss

Bayda: хм, это странно. у вас в цикле не каких методов кастомных не используется больше, которые могут менять это значение?

Bayda: Конечно не совсем по теме, но я бы советовал все же обновить пхп. 5.3 это ну уж слишком прошловечное.

Округляет он правильно. Числа хранит «неправильно». Это связано с тем, как float хранится в памяти. Во многих языках программирования есть такая проблема, что якобы ровное число, будучи float становится больше или меньше целого на один бит.
Как этого избежать не знаю. Когда сам с этим столкнулся, сделал костыль в виде конвертирования числа в строку, почему-то некоторые строковые функции умеют обходить эту проблему.

Войдите, чтобы написать ответ

Есть ли волшебный метод, чтобы запретить var_export вытащить приватные поля класса?

Источник

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

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

round($myvar,2) не round($myvar,2) никаких результатов, возможно, вы выполняете echo или print , покажите нам полный код

Может быть, это будет полезно, если вы предоставите часть кода, которая производит переменную, которую вы хотите округлить. Действительно ли вы уверены, что вы предоставляете поплавок?

Ребята, попробуйте: 9.7752 Попробуйте округлить это число, я пытаюсь получить 9.78 или что-то в этом роде, но оно возвращает 9.779999999999999 .

@MarkBaker забыть часть €, которая была добавлена в части HTML, попробуйте округлить (9.7752,2), не работает правильно oO

Какова precision настройки в вашей конфигурации php.ini ? Было ли оно изменено со значения по умолчанию 14 ?

@AhmedAli — Ну, если они не используют настройку точности по умолчанию для точности, и они не позволят вам изменить ее, то вы смените провайдера

3 ответа

И я получил: 9.779999999999999

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

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

Обратите внимание, что number_format () добавит запятые к большим числам. Это может или не может быть полезным выходом, в зависимости от ваших обстоятельств.

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

Если вы пришли сюда с проблемой, когда функция PHP round() ошибочна (т.е. round(1.4447, 2) будет выводить 1.44 вместо 1.45 ), так как round выглядит всего в 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) с тем же результат для данного float 1.4447 .
  • $startAt просто определяет начальную точку для «процесса округления» или требуемой точности.

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

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

Источник

Некорректная работа функции round

Некорректная работа
Не могу разобраться в чём ошибка,пользователь вводит имя,и ссайт должен его поприветствовать,но.

Некорректная работа mail()
Подкажите плз у меня с сервера почему то не отправляется почта с аттачами. но функция mail().

Некорректная работа ЧПУ на сайте
Здравствуйте. Помогите, пожалуйста, решить следующую проблему: На сайте есть страницы типа.

Некорректная работа поиска по сайту
Уважаемые программисты, подскажите пожалуйста по такому непрофи вопросу. Изучаю PHP, сделал поиск.

1) Причем тут Phpexcel? Round() — это встроенная функция PHP
2) Прекращайте юзать » 3) Проверил у себя на сервере Ваш скрипт в виде

 $float = (float) "9.699999999999999"; $new = round($float,2); echo $new; // Должно возвращать "9.7", но возвращает также "9.699999999999999" ?>
require_once 'PHPExcel/PHPExcel.php'; $pExcel = PHPExcel_IOFactory::load('12.xls');
$float = (float) "9.699999999999999"; $new = round($float,2); echo $new;

Источник

Оцените статью