Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Странная работа функции ceil
Скрипт банальный. Так вот, если вводить "0.28", то результатом будет 29, если "1.28" будет 128, если "0.18" будет 18, если "0.38" будет 38.
Я не считаю себя крутым спецом в php программировании, но я уже года 4 на нем пишу сайты. С таким столкнулся не впервые, бывало нечто подобное и ранее. Раньше, выкручивался вводя дополнительные операции или чуть по другому составляя код.
Скажите, а как в таких случаях выкручиваются профессионалы? И что можно сделать в данном конкретном скрипте?
----- ____________________________________________________________________
Ну как то так, наверное. http://grefon[dot]com
dessor
Отправлено: 17 Февраля, 2011 - 21:14:06
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
Да, так конечно работает) НО, задача фунции ceil теряется... а именно, округлять в большую сторону!
Т.е., если будет не 0.28, а 0.281, то должно получится именно 29.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
dessor
Отправлено: 17 Февраля, 2011 - 21:50:23
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
grefon, так функция ошибается... OrmaJever, подход понятен, но для других то чисел все нормально! Я могу в своем скрипте сделать исключение для этого "28", но кто может утверждать, что оно одно такое?... никто
К тому же по мануалу функция ceil принимает тип float...
Ну хорошо, подскажите тогда, плиз, как реализовать округление числа до двух знаков после запятой другим способом?
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
dessor пишет:
К тому же по мануалу функция ceil принимает тип float...
Ну вот поэтому она и округляет. Просто функция не ращитана на холостую работу (т.к. в 28 округлять нечего)
нужно поставить условие перед округлением и округлять только числа floatis_float()
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
JustUserR
Отправлено: 18 Февраля, 2011 - 10:55:33
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
dessor пишет:
И что можно сделать в данном конкретном скрипте?
Действительной причиной осуществления нестабильного фунционирования операции округления в большую сторону в предполагаемого PHP-приложении является обеспечения трактования локальных числовых элементов в виде значений с плавающей точкой типа float - использование указанного метода трактования осуществляет формирование внутреннего представления числа с предварительной детерминированной погрешностью - обусловленность которой обеспечивается различием в конкретном значении десятичного числа и наиболее точным приближением комбинации элементов двоичной мантиссы и характеристического поля - таким образом для каждого из целых десятичных чисел типа N определенных в уровне float-трактования в действительности обеспечивается представление в виде N-eps или N+eps соответственно в зависимости исключительно от конкретного выбранного числа - что и осуществление выбор результата функционирования ceil-операции с недетерминированным исходом
dessor пишет:
Как в таких случаях выкручиваются профессионалы?
В качестве реального унифицированного метода решения предполагаемой задачи является использование десятичной арифметики - то есть осуществление операций с непосредственными десятичными тетрадами в десятично-двоичном коде
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
dessor
Отправлено: 18 Февраля, 2011 - 11:26:32
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
OrmaJever, к сожалению is_float воспринимает $a, именно как float... Код:
JustUserR, . До такого уровня понимания php мне очень далеко)
Цитата:
с непосредственными десятичными тетрадами
Т.е. говоря простым языком, представлять числа в виде массива, как в модулях операций со сверхбольшими числами? Жесть. Этак, любая php-разработка с участием float поднимется в несколько раз в стоимости и столько же во времени...
Такие глюки только с float? С int все нормально? (Добавление)
Собственно говоря правильно, что $a воспринимается как float - все корректно с точки зрения автоматического приведения типов php.
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
dessor пишет:
Т.е. говоря простым языком, представлять числа в виде массива, как в модулях операций со сверхбольшими числами? Жесть
Осуществление решения предполагаемой задачи на основе указанной метода в действительности требует высоких вычислительных ресурсов по причине требования выполнения ассоциированных команд процессора на уровня трактования исполняемого медленного приложения - однако реальной причиной возникнования указанного аспекта функционирования является некорректное использование типа данных float для хранения чисел с фиксированной точкой
dessor пишет:
Такие глюки только с float? С int все нормально?
Проявление рассматриваемых аспектов функционирования PHP-приложения в действительности осуществляется исключительно при использовании информационных полей расположенных в уровня трактования чисел с плавающей запятой типа float или double - дело в том что в случае применение целых чисел или элементов с фиксированной точкой целевое представление является либо фиксированным либо включает односторонную детерминированную поразрядную погрешность
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
dessor
Отправлено: 18 Февраля, 2011 - 19:36:43
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2011
Помог: 0 раз(а)
JustUserR пишет:
однако реальной причиной возникнования указанного аспекта функционирования является некорректное использование типа данных float для хранения чисел с фиксированной точкой
А в чем заключается некорректность? И как правильно на данном примере использовать тип float? В идеале, с примером кода
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
dessor пишет:
Т.е., в int таких приколов быть неможет, правильно понял?
Да, int будет правильно округляться до ближайшего большего целого)
dessor пишет:
До такого уровня понимания php мне очень далеко)
На самом деле, это уровень понимания того, как хранятся данные вещественных типов с плавающей точкой в компутере вообще. В любом языке программирования.
JustUserR
Отправлено: 19 Февраля, 2011 - 20:43:08
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
dessor пишет:
А в чем заключается некорректность? И как правильно на данном примере использовать тип float? В идеале, с примером кода
Использования информационных полей типа чисел с плавающей точкой осуществляет возможность хранения нецелых величин в условием обеспечения их хранения в виде максимального ближайшего приблежения в заданном контейнерком блоке - таким образом осуществление применение операции приведения числа типа float в целому элементу может производиться исключительно на основании анализа минимального отклонения - в то время как обеспечение корректного результата для функций типа floor/ceil не может гарантироваться
dessor пишет:
Т.е., в int таких приколов быть неможет, правильно понял?
Использование информационных полей типа int для хранения целых чисел и элементов с фиксированной точкой позволяет обеспечить формирование элемента с заданной точностью - таким образом осуществление последующего использование операции преобразования в целому числу обеспечивает получение гарантированного результата
В качестве конкретного примера позволяющего пояснить указанный аспект функционирования - возможно применение того факта что при использовании целочисленных величин производится безусловное размещение оригинального элемента в разрядной сетки - в то время как использование float-информационных полей предполагает осуществление поиска соответствующего элемента с минимальной погрешностью - расположение которого может произволиться как в области больших так и меньших чисел с равной вероятностью
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.