Целочисленное деление
У деления в C++ есть подвох. Попробуйте угадать, что выводит эта инструкция:
std::cout << 7 / 2 << "\n";Она выводит:
3Не 3.5, а 3. Когда вы делите два целых числа, результат тоже целый: C++ отбрасывает десятичную часть. Он не округляет, а просто отрезает её, поэтому 19 / 10 — это 1, а 2 / 3 — это 0. Это называется целочисленным делением.
Целочисленное деление работает как деление с остатком в начальной школе: сколько раз одно число помещается в другом. Остаток даёт оператор % (знак процента, который программисты называют «остаток от деления» или «модуло»):
std::cout << 7 / 2 << "\n";
std::cout << 7 % 2 << "\n";
std::cout << 10 % 5 << "\n";Это выведет:
3
1
0Двойка помещается в семёрку три раза (3 × 2 = 6), и остаётся 1. Если деление выполняется точно, остаток равен 0. Так распознают чётные числа: чётное число при делении на два даёт остаток 0, а нечётное — 1. Оператор % работает только с целыми числами.
Если нужен десятичный результат, хотя бы одно из чисел должно быть десятичным:
std::cout << 7.0 / 2 << "\n";
std::cout << 7 / 2.0 << "\n";
std::cout << 10.0 / 3 << "\n";Это выведет:
3.5
3.5
3.33333std::cout выводит десятичные числа максимум с 6 значащими цифрами, поэтому вы видите 3.33333.
Типичная ошибка — думать, что достаточно сохранить результат в double:
double half = 7 / 2;
std::cout << half << "\n";Это выведет:
3Сначала C++ вычисляет 7 / 2. Оба числа целые, поэтому результат равен 3, и только потом эта тройка сохраняется в half. Тип переменной слева от = не имеет значения.
А если нужно разделить две переменные типа int? Преобразуйте одну из них в десятичное число с помощью static_cast<double>(...):
int points = 7;
int games = 2;
std::cout << static_cast<double>(points) / games << "\n";Это выведет:
3.5static_cast<double>(points) берёт значение points как десятичное число. Сама переменная остаётся типа int.
Задание
- 1
Четверо друзей заказали пиццы, нарезанные всего на 18 кусков. Сколько целых кусков достанется каждому из них? Вычислите это из переменных и выведите:
Кусков каждому: 4 - 2
Сколько кусков останется? Вычислите это с помощью
%и выведите на следующей строке:Осталось кусков: 2 - 3
Счёт — 50 EUR, и друзья делят его поровну. На следующей строке выведите, сколько платит каждый из них. При целочисленном делении получилось бы только 12, и не хватило бы 2 EUR:
Каждый платит: 12.5 EUR