Целые и десятичные числа
В первом уроке вы видели, что 10 / 2 выводит 5.0, а не 5. Теперь вы узнаете почему. В Lua два вида чисел:
- Целые числа, которые программисты называют integer:
120,0,-3. Монеты, яйца и дни Эммы — целые числа. - Десятичные числа, которые программисты называют float (от floating point, «плавающая точка» — так компьютеры их хранят):
2.5,0.75,-1.5. Их записывают с десятичной точкой, а не с запятой.
Lua всегда выводит float с десятичной точкой, даже если число целое: 5.0 — это float, 5 — integer. Количество одно и то же, но Lua следит, к какому виду относится каждое число. Узнать это позволяет функция math.type:
print(math.type(5))
print(math.type(5.0))
print(math.type(2.5))Программа выведет:
integer
float
float(math — это набор математических функций Lua. Ещё несколько из них вы используете в следующем упражнении.)
Будет результат integer или float, зависит от оператора:
+,-и*дают integer, если оба числа integer. Если одно из них float, результат тоже float:3 * 2— это6, а3 * 2.0— это6.0./(деление) всегда даёт float, даже если делится нацело:10 / 2— это5.0.//(деление с округлением вниз) делит и округляет результат вниз до целого:7 // 2— это3. Оно показывает, сколько раз одно число помещается в другое.%даёт остаток от деления:7 % 2— это1, потому что 2 помещается в 7 три раза, и остаётся 1.^возводит число в степень и всегда даёт float:2 ^ 3— это8.0.
print(7 / 2)
print(7 // 2)
print(7 % 2)
print(10 / 2)
print(2 ^ 3)Программа выведет:
3.5
3
1
5.0
8.0// и % хорошо работают вместе. Клубника созреет через 17 дней: 17 // 7 — это 2 полные недели, а 17 % 7 — 3 дня в остатке. Остаток помогает и отличать чётные числа от нечётных: чётное число при делении на 2 даёт остаток 0, нечётное — 1.
Типичные ошибки:
/там, где нужно целое число:17 / 7даёт2.4285714285714. Используйте//.- Деление с округлением на ноль:
7 // 0останавливает программу с ошибкойattempt to divide by zero. (7 / 0её не останавливает, а даётinf, бесконечность, которая тоже мало полезна.) - Десятичная запятая:
local price = 2,5не вызывает ошибки, ноpriceбудет просто2. В Lua запятая разделяет два значения. Переменная получает первое, а 5 теряется.
И ещё одно: компьютеры хранят float в двоичном виде, поэтому многие десятичные числа неточны. 0.1 + 0.2 выводит 0.3, но на самом деле результат чуть больше. Это одна из причин, по которой деньги лучше считать целыми числами, как делает Эмма со своими монетами.
Задание
- 1
Запустите программу. Она выводит
Коробок: 6.3333333333333, но Эмма не может продать треть коробки. Измените деление так, чтобы программа выводила только число полных коробок:Коробок: 6 - 2
На следующей строке выведите, сколько яиц осталось. Посчитайте это по переменным с помощью
%:Коробок: 6 Яиц осталось: 2 - 3
Торговец Гуго платит 12 монет за полную коробку. Ниже создайте переменную
boxPriceсо значением12и выведите, сколько Эмма получает за одно яйцо:boxPrice, делённое наboxSize, с помощью/. Деление получается нацело, но/всегда даёт float, поэтому Lua выведет2.0:Коробок: 6 Яиц осталось: 2 Монет за яйцо: 2.0 - 4
Наконец, проверьте вид двух результатов. Одним
printвыведитеmath.type(eggs // boxSize)иmath.type(boxPrice / boxSize)через запятую:Коробок: 6 Яиц осталось: 2 Монет за яйцо: 2.0 integer float