Глава 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 — просто отбросить дробную часть
Для отрицательных чисел это три разных ответа
Для положительных чисел
floor() и trunc() часто совпадают, поэтому разница легко ускользает от внимания. Для отрицательных — не совпадают почти никогда, как видно на числовой прямой выше.Практика: round, floor, ceil, trunc
Интерактивный ноутбук прямо в браузере — предскажите результат для отрицательных чисел