Python: правильное округление длинных float до целых чисел
Быстрый ответ
Для округления чисел в Python доступны следующие подходы:
print(round(2.5)) # Вернет 2
print(round(3.5)) # Вернет 4
В Python 3.x результат работы функции round()
— всегда целое число int
, а в Python 2.x — число с плавающей точкой float
.
Для округления в большую или меньшую сторону применяются функции из модуля math
:
from math import ceil, floor
print(ceil(2.1)) # Округляем вверх: получаем 3
print(floor(2.9)) # Округляем вниз: получаем 2
Точность и особенности работы с числами с плавающей точкой
Если требуется высокая точность при округлении, стоит использовать модуль Decimal
:
from decimal import Decimal, ROUND_HALF_UP
number = Decimal('2.5') # Избегаем ошибок округления
rounded_number = number.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
print(rounded_number) # Правильное округление до 3
Если стандартные методы округления не подходят, напишите собственную функцию. "Стань тем округлением, которое хочешь видеть в мире," — говорят программисты.
def custom_round(num):
num_str = str(num)
if '.9' in num_str:
# Обратите внимание на плавающую точку.
pass
return round(num)
print(custom_round(2.5)) # Вернется 3
Будьте осмотрительны: при работе с очень большими числами функция round()
может возвращать float.
Поведение при округлении
Иногда требуется округлить число в меньшую сторону при встрече с ".5":
# Для положительных чисел можно использовать проверенный временем прием
print(int(2.5 + 0.5)) # Получим 3 — округляем вверх
# Это решение подходит для любого вещественного числа
number = 2.5
print(int(number + (0.5 if number > 0 else -0.5))) # Аналогично получим 3
Функция round()
в Python следует принципу банковского округления и выбирает ближайшее четное число:
print(round(2.5)) # Вернет 2
print(round(3.5)) # Вернет 4
Визуализация
Представьте полку с книгами, где толщина каждой книги отражает числовое значение:
| До округления (Книги на полке) | | После округления (Выровнено по секциям) | | --------------------------------- | -> | --------------------------------------- | | 📚 2.2 📚 3.7 📚 4.5 📚 | | 📚 2 📚 4 📚 5 📚 |
Правила понятны:
- Книги, расположенные ближе к левому краю, уменьшаются 📉 (2.2 -> 2)
- Книги, стоящие посередине или дальше, увеличиваются 📈 (3.7 -> 4, 4.5 -> 5)
Каждая книга занимает позицию, наиболее близкую к целому числу. Это изящное решение!
Тонкости округления
Округление скрывает в себе ряд трудностей. Разберем типичные проблемы и рассмотрим создание точных функций округления, учтя особенности обработки больших чисел.
Округление чисел с плавающей точкой: в чем сложность?
Лучше всего проблему продемонстрирует маленький пример: сумма 0.1 и 0.2 неравна 0.3:
print(0.1 + 0.2 == 0.3) # Оказывается, это неверно!
Плавающая точка иногда может подвести. Но с этим можно бороться:
print(round(0.1 + 0.2)) # Получится 0, и это неверно.
print(round(0.1 + 0.2 + 10**(-len(str(0.1 + 0.2))-1))) # Теперь правильно: 1!
Создание пользовательской функции округления
При большом потреблении точности при округлении может потребоваться создание собственной функции округления:
def robust_round(number):
# Здесь заключается вся магия округления
pass
print(robust_round(1234.56789)) # Результат пока 'None'
Округление огромных чисел
Большие числа могут быть действительно огромными:
large_number = 1e50 + 1.5 # Много ноликов
print(round(large_number)) # Погрешность округления сравнима с размерами космического корабля
Если вы работаете с такими большими числами, преобразование числа в строку поможет избежать потери точности при округлении.
Полезные материалы
- Встроенные функции Python — документация Python 3.12.2 — официальное описание функции
round()
. - Как округлять числа в Python – Real Python — методы округления чисел в статье от Real Python.
- Функция round() в Python – GeeksforGeeks — GeeksforGeeks обсуждает
round()
в Python. - numpy.around — Руководство по NumPy v1.26 — как округлять массивы в NumPy.
- Арифметика чисел с плавающей точкой: проблемы и ограничения — документация Python 3.12.2
- Округление – Википедия — все об округлении на страницах Википедии.