В этой статье будет рассмотрена статья по использованию модуля Decimal в Python. Его можно использовать для выполнения различных математических операций с числами с плавающей запятой или числами, содержащими десятичные точки. Все примеры кода в этой статье протестированы с Python 3.9.5 в Ubuntu 21.04.
О десятичном модуле
Десятичный модуль, как следует из названия, может использоваться для обработки чисел с десятичной запятой или чисел с плавающей запятой. Методы, включенные в этот модуль, помогают округлять десятичные числа, преобразовывать числа и выполнять арифметические вычисления. Он также уделяет большое внимание точности и точности, и каждое число после десятичной точки считается значимым. Десятичный модуль рассматривает такое число, как 1,40, как 1,40, а не как 1,4. Использование десятичного модуля можно лучше понять на примерах. Некоторые из них описаны ниже.
Выполнение основных математических вычислений с использованием десятичного модуля
Вы можете вызвать модуль Decimal для преобразования числа в десятичный тип в Python. В приведенном ниже примере кода показана разница между основным математическим делением чисел целочисленного типа и числами десятичного типа.
from decimal import Decimal a = 10 b = 11 c = a / b d = Decimal(a) / Decimal(b) print (c, type(c)) print (d, type(d))
Первый оператор импортирует класс Decimal из модуля decimal. Затем создаются две переменные «a» и «b» с некоторыми значениями. Переменная «c» хранит значение, полученное путем деления переменной a на b. Затем тот же процесс повторяется путем преобразования чисел в объекты десятичного типа. После выполнения приведенного выше примера кода вы должны получить следующий результат:
0.9090909090909091 <class 'float'> 0.9090909090909090909090909091 <class 'decimal.Decimal'>
Как вы можете видеть в выходных данных выше, объект типа float показывает числа с меньшей точностью, чем объект типа decimal, поскольку он использует гораздо более агрессивный метод аппроксимации, чем объект типа decimal. По умолчанию число десятичного типа в Python показывает до 28 чисел. Вы можете изменить это значение в соответствии с вашими потребностями, вызвав метод getcontext, доступный в модуле decimal.
from decimal import Decimal from decimal import getcontext getcontext().prec = 50 a = 10 b = 11 c = a / b d = Decimal(a) / Decimal(b) print (c, type(c)) print (d, type(d))
В приведенном выше примере кода функция getcontext была импортирована, а точное положение было установлено до 50 позиций. Метод getcontext можно использовать для просмотра текущего контекста в потоке и изменения некоторых параметров конфигурации по умолчанию для десятичного модуля. После выполнения приведенного выше примера кода вы должны получить следующий результат:
0.9090909090909091 <class 'float'> 0.90909090909090909090909090909090909090909090909091 <class 'decimal.Decimal'>
Вы можете выполнять любой тип арифметических вычислений с объектами десятичного типа, которые вы можете выполнять с объектами типа float в Python. Большое количество конечных десятичных чисел в объектах десятичного типа может дать очень точные числа, которые особенно полезны в финансовых, бухгалтерских, критически важных научных приложениях и т. д.
Обратите внимание, что вы можете создавать числа десятичного типа из чисел с плавающей запятой, целых чисел и строк, содержащих числа, вызывая основной конструктор Decimal.
Округление чисел с помощью десятичного модуля
Модуль decimal поставляется с некоторыми предопределенными режимами округления, которые можно использовать для округления чисел с десятичными точками. Эти режимы называются ROUND_FLOOR, ROUND_CEILING, ROUND_HALF_DOWN, ROUND_HALF_UP, ROUND_UP, ROUND_DOWN, ROUND_HALF_EVEN и ROUND_05UP. Согласно официальной документации Python, вот что делает каждый из этих режимов:
- ROUND_FLOOR: число округляется до отрицательной бесконечности.
- ROUND_CEILING: число округляется до бесконечности или положительной бесконечности.
- ROUND_HALF_DOWN: числа округляются до ближайшего числа. Если есть ничья, число округляется до нуля. Связи – это равноотстоящие числа, которые можно округлять как в большую, так и в меньшую сторону. Например, такое число, как 4,25, можно округлить как в сторону 4,2, так и 4,3.
- ROUND_HALF_UP: числа округляются до ближайшего числа. Если есть ничья, число округляется от нуля.
- ROUND_UP: число округляется от нуля.
- ROUND_DOWN: число округляется до нуля.
- ROUND_HALF_EVEN: числа округляются до ближайшего числа. Любые связи округляются до ближайшего четного целого числа.
- ROUND_05UP: числа округляются от нуля, если последнее число равно 0 или 5. Если нет, то числа округляются до нуля.
В приведенном ниже примере кода показано поведение этих режимов.
import decimal from decimal import Decimal from decimal import getcontext getcontext().prec = 2 getcontext().rounding = decimal.ROUND_FLOOR print (Decimal(3.961) + Decimal(0)) getcontext().rounding = decimal.ROUND_CEILING print (Decimal(3.961) + Decimal(0)) getcontext().rounding = decimal.ROUND_HALF_DOWN print (Decimal(3.705) + Decimal(0)) getcontext().rounding = decimal.ROUND_HALF_UP print (Decimal(3.775) + Decimal(0)) getcontext().rounding = decimal.ROUND_UP print (Decimal(3.775) + Decimal(0)) getcontext().rounding = decimal.ROUND_DOWN print (Decimal(3.609) + Decimal(0)) getcontext().rounding = decimal.ROUND_HALF_EVEN print (Decimal(3.665) + Decimal(0)) getcontext().rounding = decimal.ROUND_05UP print (Decimal(3.675) + Decimal(0))
Пример кода довольно прост. Для округления чисел установлена точность 2 цифры. Метод округления изменяется путем установки значения объекта «округление» (часть основного контекста). После выполнения приведенного выше примера кода вы должны получить следующий результат, в котором каждая строка соответствует соответствующему режиму округления:
3.9 4.0 3.7 3.8 3.8 3.6 3.7 3.6
Округление с использованием метода квантования
Вы также можете использовать метод «квантования», доступный в десятичном модуле, для округления чисел. Процесс идентичен описанному выше методу. Однако вместо того, чтобы устанавливать числа точности отдельно, вы можете указать показатель степени в качестве аргумента метода квантования, чтобы округлить число до определенной позиции. Ниже приведен пример кода.
import decimal from decimal import Decimal rounded = Decimal(3.961).quantize(Decimal('1.0'), rounding=decimal.ROUND_FLOOR) print (rounded)
Методу квантования был предоставлен показатель степени «1.0», а в качестве дополнительного аргумента был предоставлен метод округления. Он вернет число в формате XX. После выполнения приведенного выше примера кода вы должны получить следующий результат:
3.9
Сравнение двух десятичных чисел
Вы можете сравнить любые два объекта десятичного типа, используя метод «сравнения», доступный в десятичном модуле. Примеры ниже показывают его использование.
from decimal import Decimal print (Decimal(1.2).compare(Decimal(1.1))) print (Decimal(1.0).compare(Decimal(1.1))) print (Decimal(1.0).compare(Decimal(1.0)))
Вы можете вызвать метод сравнения для объекта десятичного типа и указать другое число в качестве аргумента. Будет возвращено значение 0, 1 или -1 в зависимости от сравниваемых чисел. Значение 0 указывает, что оба числа равны, значение 1 указывает, что первое число больше второго числа, а значение -1 указывает, что первое число меньше второго. После выполнения приведенного выше примера кода вы должны получить следующий результат:
1 - 1 0
Заключение
Хотя модуль decimal чаще всего используется для управления точностью десятичного разделителя и округления чисел после десятичной точки, он поставляется с некоторыми другими полезными методами, которые в дальнейшем можно использовать для управления десятичными числами для получения точных результатов арифметических вычислений. Базовое использование модуля decimal было рассмотрено в этой статье, и этого должно хватить для большинства ситуаций. Но вы всегда можете узнать больше о расширенных методах из официальной документации Python.