Глава 4 · Python любит числа

Округление: round(), floor(), ceil(), trunc()

Несколько способов превратить дробное число в целое — и почему для отрицательных чисел они дают разные ответы.

Есть сразу несколько способов превратить дробное число в целое — и они ведут себя по-разному, особенно для отрицательных чисел.

round() — обычное округление

round_demo.py
print(round(3.14159, 2))  # 3.14
print(round(7.5))          # 8

Округление «до чётного» на границе .5

Внимательный взгляд на округление ровно посередине даёт неожиданный на первый взгляд результат:

granica.py
print(round(2.5))  # 2, а не 3!
print(round(3.5))  # 4
Округление до ближайшего чётного
Это не ошибка и не случайность: round() в Python округляет значение ровно между двумя целыми к БЛИЖАЙШЕМУ ЧЁТНОМУ — стандартный статистический приём («банковское округление»), который снижает систематический перекос при округлении множества значений. Для большинства повседневных задач это почти незаметно — но полезно знать, если результат округления вас удивил.

math.floor(), math.ceil(), math.trunc()

floor_ceil_trunc.py
from math import floor, ceil, trunc

print(floor(-2.3))  # -3 — вниз, к меньшему целому
print(ceil(-2.3))   # -2 — вверх, к большему целому
print(trunc(-2.3))  # -2 — просто отбросить дробную часть
-4-3-2-10floor(-2.3)ceil(-2.3) и trunc(-2.3)
floor округляет вниз, к -3; ceil и trunc здесь совпадают — оба дают -2
Для отрицательных чисел это три разных ответа
Для положительных чисел floor() и trunc() часто совпадают, поэтому разница легко ускользает от внимания. Для отрицательных — не совпадают почти никогда, как видно на числовой прямой выше.
Практика: round, floor, ceil, trunc
Интерактивный ноутбук прямо в браузере — предскажите результат для отрицательных чисел
Открыть практику →