ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Вещественные числа и округление в Python

Автор: · Обновлено

Тип float хранит приближённые двоичные представления дробных чисел. Он удобен для измерений, процентов и средних значений, но не обещает точного хранения каждой десятичной дроби. Округление для вывода и точность самого вычисления — разные задачи.

Среднее значение с понятным форматом

first = 4.5
second = 3.75
third = 5.0
average = (first + second + third) / 3

print(average)
print(f'{average:.2f}')

Консоль покажет:

4.416666666666667
4.42

Формат .2f создаёт строковое представление с двумя знаками после точки. Переменная average при этом не меняется. Функция round(average, 2) возвращает новое число, но при печати оно не обязано содержать завершающий ноль; форматирование подходит именно для отчёта.

Откуда берётся 0.30000000000000004

Дроби 0.1 и 0.2 не имеют конечной двоичной записи, поэтому сохраняются с небольшой погрешностью. Из-за этого точное сравнение результатов сложных вычислений через == бывает ненадёжным. В учебной задаче можно сравнить модуль разности с допустимой погрешностью, например abs(value - expected) < 1e-9.

Для денег часто удобнее хранить целое количество копеек, потому что правило округления является частью предметной области. Не пытайтесь «лечить» каждое вычисление постоянным вызовом round: раннее округление может накопить большую ошибку.

Расчёт скидки

Прочитайте цену и процент скидки через float, вычислите итог и выведите его с двумя знаками. Для цены 800 и скидки 15 ожидается 680.00. Проверьте также скидку 0 и 100. Дополнительно выведите необработанный результат, чтобы увидеть разницу между хранимым значением и оформленным текстом. Если программа выдаёт неверное число, сначала проверьте скобки и деление процента на 100, а не добавляйте случайное округление.

Точность в тестах

Вычислите 0.1 + 0.2 и выведите число с 17 знаками после точки. Сравните его с 0.3 сначала через точное равенство, затем через math.isclose. Измените абсолютный допуск и найдите слишком строгий вариант, который отклоняет практически равные результаты. После этого проведите отдельный опыт с денежной суммой, представленной целым количеством копеек. Запишите вывод: форматирование управляет отображением, допуск — правилом сравнения, а выбор типа — моделью данных. Эти решения нельзя заменять друг другом одним вызовом round.

Практикум: округление измерений без скрытой ошибки

Рассчитайте среднюю температуру по трём измерениям и выведите её с одним знаком после запятой. Сравните форматирование и round, сохранив исходное значение для дальнейших вычислений. Проверьте числа 0.1, 0.2, 0.3 и объясните неточное двоичное представление через результат 0.1 + 0.2. Для сравнения используйте допустимое отклонение, а не строгое равенство. Затем определите предметное правило: округление нужно только для экрана или должно менять хранимый результат.

Контрольная точка

Если округлить каждое слагаемое до сложения и только итог после сложения, всегда ли ответы совпадут? Подберите контрпример с денежными или измерительными данными и зафиксируйте выбранный момент округления.

Частые вопросы

Почему формат .2f не меняет саму переменную?

Спецификатор управляет текстовым представлением при выводе. Числовое значение остаётся прежним и может использоваться дальше без потери точности от отображения. Для изменения данных требуется отдельная операция и осознанное правило.

Источники