Шаг 45.
Python: сборник рецептов.
Числа, даты и время. Округление числовых значений

    На этом шаге мы рассмотрим особенности выполнения этой операции.

Задача

    Вы хотите округлить число с плавающей точкой до заданного количества знаков после точки.

Решение

    Для простого округления используйте встроенную функцию round(value, ndigits). Например:

>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-1.27, 1)
-1.3
>>> round(1.25361, 3)
1.254
>>>

    Когда значение попадает точно между двух возможных выборов для округления, эта функция будет округлять к ближайшему четному значению. То есть 1.5 или 2.5 будут округлены до 2.

    Количество знаков, которое передается функции round(), может быть отрицательным. В этом случае округление будет идти до десятков, сотен, тысяч и т. д. Например:

>>> a = 1627731 
>>> round(a, -1)
1627730
>>> round(a, -2)
1627700
>>> round(a, -3)
1628000
>>>


Обсуждение

    Не перепутайте округление с форматированием значения для вывода. Если вы хотите просто вывести число с некоторым определенным количеством знаков после точки, обычно вам не требуется round(). Вместо этого просто задайте при форматировании, сколько знаков выводить. Пример:

>>> x = 1.23456 
>>> format(x, '0.2f')
'1.23'
>>> format(x, '0.3f')
'1.235'
>>> 'value is {:0.3f}'.format(x)
'value is 1.235'
>>>

    Сопротивляйтесь желанию округлить числа с плавающей точкой, чтобы исправить проблемы с точностью вычислений. Например, вы можете подумывать поступить так:

>>> a = 2.1
>>> b = 4.2
>>> c = a + b
>>> c
6.300000000000001
>>> c = round(c, 2) # "Исправленный" результат (???)
>>> c
6.3
>>> 

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

    На следующем шаге мы рассмотрим выполнение точных вычислений с десятичными дробями.




Предыдущий шаг Содержание Следующий шаг