Как работает функция round в Python: синтаксис и примеры

Раздел: Основы Python -> Встроенные функции Python

Основы функции round

Функция round() предназначена для округления чисел с плавающей запятой до указанного количества знаков после запятой или до ближайшего целого. Это встроенная функция, не требующая импорта дополнительных модулей.

round(number, ndigits=None)

Python locals self (locals и self в python)

Аргумент number – число, которое необходимо округлить. ndigits – необязательный параметр, указывающий число знаков после запятой. Если ndigits не задан, округление выполняется до ближайшего целого. Если ndigits отрицателен, округление производится до ближайшего десятка, сотни и т.д.

print(round(3.14159))      # 3
print(round(3.14159, 2))   # 3.14
print(round(3.14159, 4))   # 3.1416

Python round (функция round в python)

3
3.14
3.1416

Как округлить число до целого?

Для округления до ближайшего целого достаточно вызвать round() с одним аргументом. Числа с дробной частью 0.5 и выше округляются в большую сторону, но с учетом банковского правила (см. далее).

print(round(4.6))   # 5
print(round(4.3))   # 4
print(round(4.5))   # 4 (банковское округление)
print(round(5.5))   # 6
5
4
4
6

Как округлить до заданного числа знаков после запятой?

Укажите второй аргумент – количество знаков. Положительное значение ndigits определяет точность справа от десятичной запятой.

print(round(123.4567, 1))   # 123.5
print(round(123.4567, 0))   # 123.0 (округляет до целого, но сохраняет тип float)
print(round(123.4567, 3))   # 123.457
123.5
123.0
123.457

Как округлить до десятков, сотен или тысяч?

Отрицательное значение ndigits позволяет округлять целые части числа. Например, -1 округляет до ближайшего десятка, -2 – до сотни и т.д.

print(round(1275, -1))   # 1280
print(round(1275, -2))   # 1300
print(round(1275, -3))   # 1000
print(round(149, -2))    # 100 (банковское правило: 149 -> 100, хотя 150 -> 200)
1280
1300
1000
100

Такое округление удобно для финансовых отчетов или при приблизительных вычислениях, где точность до десятков не критична.

Что такое банковское округление и почему оно может вызывать вопросы?

Python использует так называемое «банковское округление» или «округление до ближайшего четного» (round half to even). Когда дробная часть равна ровно 0.5, результат округляется к ближайшему четному целому. Это уменьшает накопление ошибок при большом количестве вычислений.

print(round(2.5))   # 2 (2 – четное)
print(round(3.5))   # 4 (4 – четное)
print(round(4.5))   # 4 (4 – четное)
print(round(5.5))   # 6 (6 – четное)
2
4
4
6

Такое поведение может быть неожиданным для тех, кто привык к арифметическому округлению (всегда вверх). Если требуется округление «от нуля» (например, 2.5 -> 3), необходимо использовать кастомные функции или модуль decimal.

Почему round(2.675, 2) дает 2.67 вместо 2.68?

Это классическая проблема представления чисел с плавающей запятой. Число 2.675 в двоичном виде не может быть сохранено точно, поэтому внутреннее значение слегка меньше 2.675, что приводит к округлению в меньшую сторону.

print(round(2.675, 2))   # 2.67
2.67

Для точного финансового округления рекомендуется использовать модуль decimal:

from decimal import Decimal, ROUND_HALF_UP
value = Decimal('2.675')
rounded = value.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
print(rounded)   # 2.68
2.68

В чем отличие round от форматирования строк (f-строки, format)?

Форматирование строк (например, f"{value:.2f}") возвращает строку, которая может быть напечатана с нужным количеством знаков, но не меняет числовое значение. round() возвращает число (float или int). Разница проявляется, когда результат используется в дальнейших вычислениях.

x = 3.14159
formatted = f"{x:.2f}"   # строка '3.14'
rounded = round(x, 2)    # число 3.14
print(type(formatted))    # 
print(type(rounded))      # 
# Дальнейшие операции:
print(formatted + " hello")   # строка
print(rounded + 1)            # 4.14


3.14 hello
4.14

Если нужно только отображение, используйте форматирование. Для числовых расчетов – round().

Расширенные примеры использования round

Пример 1: Округление с Decimal для финансовых расчетов

Модуль decimal позволяет задать желаемый режим округления. Помимо ROUND_HALF_UP доступны ROUND_DOWN, ROUND_UP и другие.

Пример
from decimal import Decimal, ROUND_HALF_UP, ROUND_DOWN
price = Decimal('19.995')
print(price.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))   # 20.00
print(price.quantize(Decimal('0.01'), rounding=ROUND_DOWN))      # 19.99

# Сравнение с обычным round
print(round(19.995, 2))   # 20.0 (тоже, но из-за float может отличаться)
20.00
19.99
20.0

Рекомендация: для денежных расчетов используйте Decimal с явным указанием точности и режима округления.

Пример 2: Округление с большими числами и отрицательной точностью

Округление до миллионов или миллиардов может быть полезно в макроэкономике или при приблизительных оценках.

Пример
population = 144_000_000
print(round(population, -6))   # 144000000 (до миллионов не меняется)
print(round(population, -7))   # 140000000 (до десятков миллионов)
print(round(149_000_000, -7))  # 150000000 (банковское округление: 149 -> 150, т.к. 5? нет, 149 -> 150? проверим)
144000000
140000000
150000000

Обратите внимание: 149000000 при округлении до -7 даёт 150000000 – последняя значащая цифра 9, дробная часть 0.5 не возникает.

Пример 3: Сравнение round с math.floor, math.ceil, math.trunc

Эти функции округляют всегда в одну сторону, игнорируя дробную часть.

Пример
import math
x = 3.7
y = -3.7
print(round(x))          # 4
print(math.floor(x))     # 3 (вниз)
print(math.ceil(x))      # 4 (вверх)
print(math.trunc(x))     # 3 (отбрасывает дробную часть)

print(round(y))          # -4 (банковское: -3.5 -> -4? нет, -3.7 -> -4)
print(math.floor(y))     # -4 (вниз от -3.7 -> -4)
print(math.ceil(y))      # -3 (вверх к -3)
print(math.trunc(y))     # -3
4
3
4
3
-4
-4
-3
-3

Для чисел с равной удаленностью (0.5) round ведет себя иначе: round(-3.5) вернет -4 (ближайшее четное -4).

Пример 4: Собственное округление «вверх от 0.5» (полу-вверх)

Если требуется арифметическое округление (0.5 -> 1), можно реализовать простую функцию.

Пример
def round_up(x):
    import math
    return math.floor(x + 0.5)

print(round_up(2.5))    # 3
print(round_up(3.5))    # 4
print(round_up(-2.5))   # -2 (так как floor(-2.0) = -2, но ожидается -2? арифметически -2.5 -> -2? обычно округление вверх от нуля даёт -2)
# Проверим round:
print(round(2.5))       # 2
print(round(3.5))       # 4
print(round(-2.5))      # -2
3
4
-2
2
4
-2

Функция round_up имитирует округление «от нуля» для положительных чисел. Для отрицательных чисел поведение может отличаться – можно доработать под нужные правила.

Пример 5: Округление с плавающей запятой и форматирование для научных расчетов

В научных работах часто требуется округлить до определенного количества значащих цифр. round не поддерживает значащие цифры напрямую, но можно комбинировать с логарифмами.

Пример
import math

def round_significant(value, digits):
    if value == 0:
        return 0.0
    magnitude = int(math.floor(math.log10(abs(value))))
    factor = 10 ** (digits - magnitude - 1)
    return round(value * factor) / factor

print(round_significant(1234567, 3))   # 1230000.0
print(round_significant(0.00123456, 3)) # 0.00123
print(round_significant(2.71828, 4))    # 2.718
1230000.0
0.00123
2.718

Этот метод полезен для представления результатов с заданной точностью.

Пример 6: Влияние точности float на round при вычислениях

При многократных вычислениях ошибки накапливаются. Покажем, как round может скрыть проблему или, наоборот, выявить её.

Пример
a = 0.1 + 0.2
print(a)                     # 0.30000000000000004
print(round(a, 1))           # 0.3
print(round(a, 2))           # 0.3
print(round(a, 15))          # 0.30000000000000004 (видим исходную ошибку)

# Сравнение с Decimal
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2'))   # 0.3
0.30000000000000004
0.3
0.3
0.30000000000000004
0.3

Для критически важных расчетов лучше использовать Decimal или рациональную арифметику (fractions).

Функция round в Python - comments

En
Python round (python)