Округление
В Lua есть набор готовых математических функций под названием math. Вызывают их так же, как print: пишут имя, а затем значения в скобках. В отличие от print, они ничего не выводят. Они вычисляют результат и возвращают его: отдают программе, которая может вывести его или сохранить в переменной.
Две из них округляют числа:
math.floor(x)округляет вниз, к полу:math.floor(3.7)— это3.math.ceil(x)округляет вверх, к потолку (ceil — сокращение от ceiling, «потолок»):math.ceil(3.2)— это4.
Обе возвращают integer. Так же можно избавиться от .0 после деления:
local weight = 7.6 -- тыква, в килограммах
print(math.floor(weight))
print(math.ceil(weight))
print(10 / 2)
print(math.floor(10 / 2))Программа выведет:
7
8
5.0
5«Вниз» означает к меньшим числам, в том числе ниже нуля: math.floor(-3.5) — это -4.
В Lua нет функции, которая округляет до ближайшего целого. math.round(7.6) заканчивается ошибкой attempt to call a nil value (field 'round'): в math нет ничего с именем round, так что вызывать нечего. Чтобы округлить до ближайшего целого, прибавьте 0.5 и округлите вниз:
print(math.floor(7.6 + 0.5))
print(math.floor(7.4 + 0.5))Программа выведет:
8
7Ещё три полезные функции:
math.max(a, b, …)возвращает наибольшее из переданных значений, аmath.min(a, b, …)— наименьшее. Передать можно сколько угодно значений.math.abs(x)возвращает модуль: число без знака минус.math.abs(-3)— это3.
local morning = -3 -- градусов
local noon = 5
print(math.max(morning, noon, 2))
print(math.min(morning, noon, 2))
print(math.abs(morning - noon))Программа выведет:
5
-3
8Температура поднялась на 8 градусов. morning - noon — это -8, а math.abs делает разницу положительной, какое бы число ни стояло первым.
math.min и math.max удобны и для ограничений. Например, у Эммы 7 грядок, поэтому даже с 10 пакетиками семян она посадит не больше math.min(packets, 7) из них.
Задание
- 1
Запустите программу. Эмма не может сходить к колодцу 5.625 раза: ей придётся идти 6 раз, а в последний раз лейка будет наполнена лишь частично. Округлите число походов вверх с помощью
math.ceil, чтобы программа вывела:Походов к колодцу: 6 - 2
В конце программы выведите наибольшее число яиц, которое куры снесли за один день. Используйте
math.maxс тремя переменными:Походов к колодцу: 6 Больше всего яиц за день: 9 - 3
На следующей строке выведите среднее число яиц в день, округлённое вниз: сложите три дня, разделите сумму на 3 и округлите вниз с помощью
math.floor. (Без округления получилось бы6.6666666666667.)Походов к колодцу: 6 Больше всего яиц за день: 9 В среднем яиц в день: 6