Пакет 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