Python десятичное – деление, округление, точность

Пакет Python decimal помогает нам при делении с правильной точностью и округлением чисел.

Пакет Python decimal

В этом уроке по десятичному модулю в Python мы увидим, как мы можем управлять десятичными числами в наших программах для точности, форматирования и выполнения вычислений. Точность с десятичными числами легко потерять, если числа не обрабатываются правильно. Давайте посмотрим, как модуль decimal и его доступные функции помогают в этих областях.

Работа с десятичными числами

Десятичные числа – это просто числа с плавающей запятой с фиксированной десятичной точкой. Мы должны правильно округлять числа в соответствии с нашими потребностями, иначе результаты могут быть непредсказуемыми. Десятичный модуль Python помогает нам быть более точными с десятичными числами.

Необходимость модуля десятичных чисел

Прежде чем фактически использовать этот модуль, давайте посмотрим, о какой точности идет речь, и определим, зачем нам действительно нужен этот модуль. Посмотрим на следующий фрагмент кода:

division = 72 / 7
print(division)

Давайте посмотрим на вывод этой программы: Ну, ответ на самом деле не был точным, и вообще не было никаких десятичных точек! Давайте посмотрим, как мы можем исправить это, используя модуль decimal.

Использование модуля decimal

Во всех программах, о которых мы будем говорить в этом посте, мы будем импортировать модуль decimal во все из них:

import decimal

Может случиться так, что мы импортируем только определенную функцию из этого модуля. Это можно сделать следующим образом:

from decimal import Decimal

Давайте начнем включать модуль decimal в некоторые программы.

Пример модуля decimal в Python

Мы начнем с примеров, связанных с модулем сейчас.

Коррекция деления с десятичными дробями

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

import decimal

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

Давайте посмотрим на вывод этой программы: Заметьте, что деление теперь правильное и точное, или, может быть, слишком точное?

Управление точностью для одной операции

В последней программе в ответе было 25 десятичных знаков. Но что, если мы хотим получить только три знака после запятой? Это также можно контролировать. Здесь мы будем контролировать точность ответа, которая не будет отражаться в других операциях в нашей программе:

import decimal

with decimal.localcontext() as ctx:
    ctx.prec = 3
    division = decimal.Decimal(72) / decimal.Decimal(7)
    print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

Мы выполнили операцию деления два раза, чтобы продемонстрировать точку зрения. Давайте посмотрим на вывод этой программы: Заметили что-нибудь? Точность, которую мы установили, была действительна только один раз. В следующий раз, когда мы снова выполнили деление, мы получили тот же результат.

Управление точностью для полной программы

Также можно контролировать точность глобально в программе. Это не рекомендуется постоянно, когда вы имеете дело с большим количеством чисел в вашей программе. Вот пример:

import decimal

decimal.getcontext().prec = 3

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

Давайте посмотрим вывод этой программы:

Округление чисел

Возможно изящно округлить числа с помощью функции round(...). Давайте попробуем:

import decimal

#Может быть округлено до 13,48 или 13,49
rounded = round(13.485, 2)
print(rounded)

Давайте посмотрим вывод этой программы: Число в программе может быть округлено до 13,48 или 13,49. По умолчанию функция round(...) округляет вниз. Это также можно изменить:

import decimal

#Может быть округлено до 13,48 или 13,49
rounded = round(13.485, 2)
print(decimal.Decimal(rounded).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP))

Давайте посмотрим вывод этой программы:

Получение контекста десятичного числа Python

Если вас интересует просмотр контекста, установленного по умолчанию для модуля decimal, вы можете использовать следующий скрипт:

from decimal import *
print(getcontext())

Давайте посмотрим на вывод этой программы: Вот и всё, что касается модуля десятичных чисел Python, он очень полезен при работе с числами с плавающей запятой.

Source:
https://www.digitalocean.com/community/tutorials/python-decimal-division-round-precision