$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
Да и в моей книге то же самое написано... ceil(3) = 3
Спустя 1 минута, 23 секунды (19.04.2011 - 14:54) Семён написал(а):
round — Округляет число типа float
ceil — Округляет дробь в большую сторону
floor — Округляет дробь в меньшую сторону
ceil — Округляет дробь в большую сторону
floor — Округляет дробь в меньшую сторону
Спустя 1 минута, 16 секунд (19.04.2011 - 14:55) alex12060 написал(а):
floor вам в помощь. ТАм четко написано, что ceil округляет в большую сторону!
Спустя 2 минуты, 35 секунд (19.04.2011 - 14:58) demoniqus написал(а):
Семен, почему тогда 95% полученных значений нормальные?
Я прекрасно знаю, что floor - возвращает наибольшее целое число, не превосходящее округляемое; ceil - возвращает наименьшее целое число, но не меньше округляемого; round - возвращает ближайшее целое число
Я прекрасно знаю, что 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
precision (количество цифр после запятой)
float round ( float $val [, int $precision] )
precision (количество цифр после запятой)
Спустя 2 минуты (19.04.2011 - 15:11) demoniqus написал(а):
Всегда имел 5 по математике.
Компьютерное округление несколько отличается, т.к. является условным (функции CEIL и FLOOR). Безусловным округлением является ROUND, но я ее не использую.
Компьютерное округление несколько отличается, т.к. является условным (функции 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 этого гарантировать не может... можно написать условный оператор: если полученное значение менее округляемого, то увеличить его... однако это уже криво...
функция 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
и т.д.
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 каждый раз пока что получает задание округлить ЦЕЛОЕ число.
Пока $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.7[10] = 0.1011001100110.... т и т.д. то есть 0.01(0110) [2]
в итоге 33.7[10] = 100001.01(0110)[2]
Вот теперь умножайте честно 11100110 * 100001.01(0110) и глядите, что полезет.
калькулятор считает в десятичной системе.
Эксель, кстати, тоже вполне может.
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