[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: поведение функции CEIL
demoniqus
Имею код
$result .= ceil ($LoadUnloadPrice * $res3[11] * 100) / 100;

где
$LoadUnloadPrice = 230
$res3[11] = 33.7

поскольку я не был уверен, что не будет получаться копеек при данном подсчете, то использовал умножение и деление на сто, чтобы округлить, сохранив два знака после запятой. Так вот в чем загвоздка... при умножении на калькуляторе, столбиком на бумажке и в Excel'e ответ должен получиться 7751, однако
$result = 7751.01
Подобная хрень получается также со значениями
$res3[11] = 1.1
$res3[11] = 8.3
Со многими другими $res3[11] эта копейка на хвосте не появляется. Кто-то может объяснить, почему так происходит?



Спустя 5 минут, 21 секунда (19.04.2011 - 14:53) demoniqus написал(а):
Кстати, если убираю деление и умножение на 100, то образуется вообще лишний рубль! Хотя согласно инструкции http://www.php.su/functions/?ceil при попытке так округлить целое число я его и должен получить обратно...
Да и в моей книге то же самое написано... ceil(3) = 3

Спустя 1 минута, 23 секунды (19.04.2011 - 14:54) Семён написал(а):
round — Округляет число типа float
ceil — Округляет дробь в большую сторону
floor — Округляет дробь в меньшую сторону

Спустя 1 минута, 16 секунд (19.04.2011 - 14:55) alex12060 написал(а):
floor вам в помощь. ТАм четко написано, что ceil округляет в большую сторону!

Спустя 2 минуты, 35 секунд (19.04.2011 - 14:58) demoniqus написал(а):
Семен, почему тогда 95% полученных значений нормальные?
Я прекрасно знаю, что floor - возвращает наибольшее целое число, не превосходящее округляемое; ceil - возвращает наименьшее целое число, но не меньше округляемого; round - возвращает ближайшее целое число

Спустя 2 минуты, 16 секунд (19.04.2011 - 15:00) alex12060 написал(а):
Что Вы сейчас написали? Вы прочтите внимательно Вашу ссылку, и то, что там написано (по ссылке пройдите).

Спустя 3 минуты, 24 секунды (19.04.2011 - 15:03) demoniqus написал(а):
Прошел по ссылке и в первом примере в третьей строке написано
echo ceil(3.0);    // 3

Спустя 2 минуты, 14 секунд (19.04.2011 - 15:06) Семён написал(а):
У вас по математике 2-ка была в школе? Вы знаете вообще как работает округление?

Спустя 3 минуты, 17 секунд (19.04.2011 - 15:09) Семён написал(а):
Стоит ещё обратить внимание на [, int $precision] и своё деление на 100
float round ( float $val [, int $precision] )

precision (количество цифр после запятой)

Спустя 2 минуты (19.04.2011 - 15:11) demoniqus написал(а):
Всегда имел 5 по математике.
Компьютерное округление несколько отличается, т.к. является условным (функции CEIL и FLOOR). Безусловным округлением является ROUND, но я ее не использую.

Спустя 2 минуты, 13 секунд (19.04.2011 - 15:13) Trianon написал(а):
demoniqus
Цитата
при попытке так округлить целое число я его и должен получить обратно...


Дело в том, что Вы округляете нецелое число.

33.7 - число нецелое.
и 33.7 * 100 - тоже число нецелое.
И если б Вы честно выполнили все действия на бумажке, то получили бы тот же результат.
Честно выполнить все действия - это преобразовать все числа в двоичную систему счисления, в ней выполнить умножение, а затем преобразовать результат обратно.

Спустя 3 минуты, 38 секунд (19.04.2011 - 15:17) demoniqus написал(а):
А вот precision - уже ближе к телу... но есть одно но...
функция ceil гарантирует, что полученное значение будет не меньше округляемого. Поэтому я ее и использую... и функция round этого гарантировать не может... можно написать условный оператор: если полученное значение менее округляемого, то увеличить его... однако это уже криво...

Спустя 4 минуты, 20 секунд (19.04.2011 - 15:21) demoniqus написал(а):
Прошу всех обратить внимание на мою реплику, что 95% возвращаемых значений нормальные!
ceil (21.8*230*100)/100=5014
ceil(0.3*230*100)/100=69
ceil (1*230*100)/100=230
ceil (0.1*230*100)/100=23
ceil (0.7*230*100)/100=161
и т.д.

Спустя 5 минут, 11 секунд (19.04.2011 - 15:26) Trianon написал(а):
demoniqus
что толку ссылаться на проценты.
Выполните вычисления в каждом спорном случае - убедитесь, что Вас не обманывают.

Спустя 4 минуты, 42 секунды (19.04.2011 - 15:31) demoniqus написал(а):
Так ведь и выполнил... на калькуляторе, на бумажке в столбик, в Excel'e
Пока $LoadUnloadPrice = 230, каждый раз внутри скобок функции округления получаю число как минимум с двумя нулями ДО запятой, а значит функция CEIL каждый раз пока что получает задание округлить ЦЕЛОЕ число.

Спустя 15 минут, 42 секунды (19.04.2011 - 15:47) Trianon написал(а):
demoniqus
калькулятор считает в десятичной системе.
Эксель, кстати, тоже вполне может.
230[10] = 11100110[2]
33.7[10] = 33[10] + 0.7[10]
33[10] = 100001[2]
0.7[10] = // тут сложнее:

         0.
0.7 * 2 = 1.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
0.4 * 2 = // и тут мы видим периодическую двоичную дробь

так что 0.7[10] = 0.1011001100110.... т и т.д. то есть 0.01(0110) [2]
в итоге 33.7[10] = 100001.01(0110)[2]

Вот теперь умножайте честно 11100110 * 100001.01(0110) и глядите, что полезет.

Спустя 27 минут, 22 секунды (19.04.2011 - 16:14) demoniqus написал(а):
В общем вот где проблема...http://www.php.net/manual/en/language.types.float.php
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.