Python: правильное округление длинных float до целых чисел

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для округления чисел в Python доступны следующие подходы:

Python
Скопировать код
print(round(2.5))  # Вернет 2
print(round(3.5))  # Вернет 4

В Python 3.x результат работы функции round() — всегда целое число int, а в Python 2.x — число с плавающей точкой float.

Для округления в большую или меньшую сторону применяются функции из модуля math:

Python
Скопировать код
from math import ceil, floor
print(ceil(2.1))   # Округляем вверх: получаем 3
print(floor(2.9))  # Округляем вниз: получаем 2
Кинга Идем в IT: пошаговый план для смены профессии

Точность и особенности работы с числами с плавающей точкой

Если требуется высокая точность при округлении, стоит использовать модуль Decimal:

Python
Скопировать код
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

Если стандартные методы округления не подходят, напишите собственную функцию. "Стань тем округлением, которое хочешь видеть в мире," — говорят программисты.

Python
Скопировать код
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":

Python
Скопировать код
# Для положительных чисел можно использовать проверенный временем прием
print(int(2.5 + 0.5))  # Получим 3 — округляем вверх

# Это решение подходит для любого вещественного числа
number = 2.5
print(int(number + (0.5 if number > 0 else -0.5)))  # Аналогично получим 3

Функция round() в Python следует принципу банковского округления и выбирает ближайшее четное число:

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:

Python
Скопировать код
print(0.1 + 0.2 == 0.3)  # Оказывается, это неверно!

Плавающая точка иногда может подвести. Но с этим можно бороться:

Python
Скопировать код
print(round(0.1 + 0.2))  # Получится 0, и это неверно.
print(round(0.1 + 0.2 + 10**(-len(str(0.1 + 0.2))-1)))  # Теперь правильно: 1!

Создание пользовательской функции округления

При большом потреблении точности при округлении может потребоваться создание собственной функции округления:

Python
Скопировать код
def robust_round(number):
    # Здесь заключается вся магия округления
    pass

print(robust_round(1234.56789))  # Результат пока 'None'

Округление огромных чисел

Большие числа могут быть действительно огромными:

Python
Скопировать код
large_number = 1e50 + 1.5  # Много ноликов
print(round(large_number))  # Погрешность округления сравнима с размерами космического корабля

Если вы работаете с такими большими числами, преобразование числа в строку поможет избежать потери точности при округлении.

Полезные материалы

  1. Встроенные функции Python — документация Python 3.12.2официальное описание функции round().
  2. Как округлять числа в Python – Real Pythonметоды округления чисел в статье от Real Python.
  3. Функция round() в Python – GeeksforGeeksGeeksforGeeks обсуждает round() в Python.
  4. numpy.around — Руководство по NumPy v1.26 — как округлять массивы в NumPy.
  5. Арифметика чисел с плавающей точкой: проблемы и ограничения — документация Python 3.12.2
  6. Округление – Википедиявсе об округлении на страницах Википедии.