Округление в большую сторону

Откуда взялась формула (a + b - 1) / b для округления дроби в большую сторону? Где можно прочитать про ее вывод?


Ответы (2 шт):

Автор решения: Harry

Ну а что тут читать? естественно, предполагается, что a и b - натуральные, так?

Тогда при a в диапазоне от kb+1 до kb+b мы должны получить в качестве "окргуления" :) в большую сторону значение k+1. Так?

Например, от 11 до 15 при делении на 5 мы должны получить 3.

В нашем распоряжении есть целочисленное деление, отбрасывающее дробную часть. Чтобы получить с его помощью значение k+1 для a = kb+1, мы должны прибавить к нему по крайней мере b-1, и получить kb+b, которое при делении на b даст ровно k+1, без остатка.

Если мы это же значение прибавим к следующему по величине числу, получится тот же результат деления, так как остаток 1/b будет отброшен. И так - до значения kb+b, при котором деление отбросит остаток (b-1)/b, меньший 1.

Вот собственно и все. Получается, что прибавление b-1 обеспечивает округление a/b в большую сторону за счет появления остатка, меньшего 1, при целочисленном делении.

Разжевывание 1

Любое число a можно представить как kb+c, где k — результат целочисленного деления a на b, а c — остаток от деления.

Например, a = 12, b = 5, итого k = 2, c = 2. Вы хотите с округлением в большую сторону получать как результат не 2, а 3.

При делении kb на b получается ровно k, так что округление в большую сторону дает тот же результат. А вот для чисел от kb+1 до kb+b-1получающийся результат целочисленного деления k нужно для округления в большую сторону увеличить на 1. Т.е. по сути прибавить b/b...

Разжевывание 2

По сути нужно прибавить к результату 1, т.е. b/b, т.е. вроде бы a/b+b/b = (a+b)/b, но этот результат будет неверен для a = kb, так что знаменатель надо чуточку уменьшить - до (a+b-1)/b. Тогда для a = kb получим k (как и надо), а для всех больших kb, но меньших (k+1)bk+1, как и требовалось.

Отступление

По сути, нужно получить функцию "потолок" из функции "пол" для дроби (см. об этих функциях здесь).

→ Ссылка
Автор решения: AlexGlebe

при обычном делении получаем округление в меньшую

6 / 7 = 0
7 / 7 = 1
8 / 7 = 1

а вы хотите в большую. Добавляем делитель

(6 + 7) / 7 = 1
(7 + 7) / 7 = 2
(8 + 7) / 7 = 2

Чуть чуть не так, хочется 7 / 7 = 1 , тогда отнимаем единицу

(6 + 7 - 1) / 7 = 1
(7 + 7 - 1) / 7 = 1
(8 + 7 - 1) / 7 = 2

Вот и получилась формула методом тыка (число + делитель - 1) / делитель

→ Ссылка