Содержание
В языке Python существует несколько видов округления. Среди них представлены функция непосредственного округления round, а также ceil, floor и trunc модуля math. Кроме этого возможно округление при помощи приведения к типу int и не используя библиотеки.
Ceil
Функция math.ceil позволяет округлить число в большую сторону. При чём к большему число округляется, учитывая свой знак.
Для положительного числа
Ввод:print («Ceil:», math.ceil(2.4))
Вывод:Ceil: 3
Для отрицательного числа
Ввод:print («Ceil:», math.ceil(-1.2))
Вывод:Ceil: -1
Floor
Math.floor округляет число в меньшую сторону. Работает по принципу ceil, но наоборот.
Ввод:print («Floor:», math.floor(7.99))
Вывод:Floor: 7
Trunc
Math.trunc отбрасывает дробную часть.Округление при этом не выполняется. Число всего лишь преобразуется из класса float в класс int.
Ввод:print («Trunc:», math.trunc(2.3))
Вывод:Trunc: 2
Округление без использования библиотек
Результат работы функции int,приводящей число из вещественного в целое аналогичен тому, что даёт функция trunc. Арифметическое округление можно реализовать при помощи прибавления 0.5 к результату приведения, если число является положительным, и отнимания 0.5, если оно отрицательное.
Код данной процедуры имеет такой вид:
defmath_round(n):
n = int(n + (0.5 if n> 0 else -0.5))
return nВвод:print («Math round:», math_round(2.5))
Вывод:Math round: 3
Функция round
Round является стандартной функцией для округления в языке Python. От математического округления она отличается тем, что если дробная часть равна 0.5, то числа приводится к ближайшему чётному. Но это характерно лишь для 3-й версии языка Python. В Python 2 округление является арифметическим.
Ввод:print («Round:», round(2.5))
Вывод:Round: 2
Кроме самого действительного числа функция round имеет ещё один необязательный аргумент. Он является целым числом и показывает до какого количества знаков после запятой будет происходить округление.
Ввод:print («Round, precision 0.01:», round(-4.335, 2))
Вывод:Round, precision 0.01: -4.33
Ошибки округления
Итоги работы функции round могут иметь погрешность. Это происходит из-за неточности перевода числа из десятичной системы в двоичную. Далее продемонстрированы примеры различного вывода при схожих обстоятельствах.
- Ввод:print («Round, precision 0.1:», round(4.95, 1))
Вывод:Round, precision 0.1: 5.0 - Ввод:print («Round, precision 0.1:», round(4.35, 1))
Вывод:Round, precision 0.1: 4.3
Тип Decimal и его округление
Для того, чтобы избежать погрешности при округлении используется тип Decimal. Для его использования необходимо подключить одноимённый модуль языка Python.
Decimal – это специальный тип для чисел фиксированной точности. Его значения содержат фиксированное количество знаков после запятой. Для округления чисел данного типа используется метод quantize. В качестве первого аргумента он содержит объект типа Decimal, показывающий до какого количество знаков необходимо округлить число.
Ввод:num = Decimal(«4.35»)
print(«Quantize: «, num.quantize(Decimal(«1.0»)))
Вывод:Quantize: 4.4
Также функция quantize имеет ещё один параметр. Это константа, определяющая округление. По умолчанию константа имеет значение ROUND_HALF_EVEN. Это значит, что число округляется в большую сторону в том случае, если вторая с конца цифра нечетная, а цифра, находящаяся после неё, имеет значение 5 или более.
Пример с нечётной цифрой
Ввод:num = Decimal(«9.015»)
print(«Quantize (Half even): «, num.quantize(Decimal(«1.00»), ROUND_HALF_EVEN))
Вывод:Quantize(Half even) : 9.02
Пример с чётной цифрой
Ввод:num = Decimal(«9.045»)
print(«Quantize (Half even) : «, num.quantize(Decimal(«1.00»), ROUND_HALF_EVEN))
Вывод:Quantize(Half even) : 9.04
Кроме константы по умолчанию присутствуют следующие значения:
- ROUND_HALF_UP:Округляет вверх, если последняя цифра числа больше либо равна 5.
- ROUND_HALF_DOWN: Округляет вверх, если последняя цифра числа строго больше 5.
- ROUND_05UP:Число округляется в большую сторону только если предпоследняя цифра равна 0. Иначе — в меньшую.
- ROUND_CEILING: Всегда округляет в большую сторону, кроме случая, когда последняя цифра равна 0.
- ROUND_FLOOR: Всегда округляет в меньшую сторону.