import decimal decimal.Context(prec=None, rounding=None, Emin=None, Emax=None, capitals=None, clamp=None, flags=None, traps=None)
prec=None
- точность арифметических операций,rounding=None
- режим округления,Emin=None
- показатель степени в диапазоне [MIN_EMIN, 0]
Emax=None
- показатель степени в диапазоне [0, MAX_EMAX]
capitals=None
- как выводить символ степени,clamp=None
- интервал десятичного числа в текущем контексте,flags=None
- список со статусами отслеживания сигналов,traps=None
- список с сигналами.Класс Context()
модуля decimal
создает новый контекст. Если не указано ни одного аргумента, значения по умолчанию копируются из decimal.DefaultContext
. Если аргумент flags
не указан или отсутствует, все флаги очищаются.
Аргумент prec
это целое число, которое задает точность арифметических операций в контексте. Данное число может принимать значения из интервала [0, MAX_PREC]
.
Аргумент rounding
позволяет задать режим округления.
Аргументы traps
и flags
являются списками с сигналами и статусами их отслеживания.
Аргументы Emin
и Emax
являются целыми числами, задающими пределы для показателя степени. Значения Emin
лежат в диапазоне [MIN_EMIN, 0]
, а значения Emax
в диапазоне [0, MAX_EMAX]
.
Аргумент capitals
определяет как выводить символ степени. По умолчанию это значение установлено в 1, что соответствует использованию заглавной буквы E
, а 0 приводит к использованию строчной буквы e
.
Поле clamp
может быть равно либо 1 либо 0 по умолчанию. Если установлено в 1, экспонента - e
десятичного числа в текущем контексте может находиться только в интервале [Emin - prec + 1, Emax - prec + 1]
.
Если clamp=0
то показатель степени просто не превосходит Emax
. Когда `clamp=1 то его показатель степени будет уменьшаться а к коэффициенту добавляться соответствующее число нулей, таким образом это позволяет соответствовать ограничениям показателям степени, но приводит к потере информации о количестве значащих нулей справа:
>>> from decimal import * >>> Context(prec=10, Emax=999, clamp=1).create_decimal('7.77e999') # Decimal('7.770000000E+999')
Значение clamp=1
обеспечивает совместимость с числами с плавающей точкой фиксированной длинны, которые указаны в IEEE 754.
Класс Context()
определяет несколько методов общего назначения, а также большое количество методов для выполнения арифметики непосредственно в данном контексте, которые здесь не рассматриваются.
Кроме того, для каждого метода класса Decimal()
, за исключением методов Decimal.аdjust()
и Decimal.аs_tuple()
, существует соответствующий метод Context()
.
Например, для экземпляра контекста C
и десятичного экземпляра x
значение C.exp(x)
эквивалентно x.exp(context=C)
. Каждый метод Context
принимает целое число Python - экземпляр int
везде, где принимается экземпляр decimal.Decimal()
.
>>> import decimal >>> decimal.getcontext() # Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, # Emax=999999, capitals=1, clamp=0, flags=[Inexact, Rounded], # traps=[InvalidOperation, DivisionByZero, Overflow]) >>> C = decimal.Context(prec=5, rounding=decimal.ROUND_UP, clamp=1, Emax=999, traps=[decimal.InvalidOperation, decimal.DivisionByZero]) >>> decimal.setcontext(C) >>> C = decimal.getcontext() >>> C # Context(prec=5, rounding=ROUND_UP, Emin=-999999, # Emax=999, capitals=1, clamp=1, flags=[], # traps=[InvalidOperation, DivisionByZero]) >>> C.create_decimal('1.23e999') # Decimal('1.23000E+999')
Context()
.clear_flags()
:Сбрасывает все сигнальные флаги на 0.
clear_traps()
:Сбрасывает все ловушки на 0.
copy()
:Вернуть дубликат контекста.
copy_decimal(num)
:Возвращает копию десятичного Decimal()
экземпляра num
.
create_decimal(num)
:Создает новый десятичный Decimal()
экземпляр из num
, но используя self
в качестве контекста. В отличие от конструктора Decimal
, точность преобразования, метод округления, флаги и ловушки применяются к преобразованию.
Это полезно, потому что константы часто задаются с большей точностью, чем требуется приложению. Еще одним преимуществом является то, что округление немедленно устраняет непреднамеренные эффекты из цифр, выходящих за пределы текущей точности. В следующем примере использование необоснованных входов означает, что добавление нуля к сумме может изменить результат:
>>> from decimal import Decimal, getcontext >>> getcontext().prec = 3 >>> Decimal('3.4445') + Decimal('1.0023') # Decimal('4.45') >>> Decimal('3.4445') + Decimal(0) + Decimal('1.0023') # Decimal('4.44')
Этот метод реализует операцию нумерации спецификации IBM. Если аргумент является строкой, никакие начальные или конечные пробелы или подчеркивания не допускаются.
create_decimal_from_float(f)
:Создает новый десятичный Decimal()
экземпляр из числа с плавающей точкой f
, но округляя его, использует self
в качестве контекста. В отличие от метода класса Decimal.from_float()
, к преобразованию применяются точность контекста, метод округления, флаги и ловушки.
>>> from decimal import * >>> context = Context(prec=5, rounding=ROUND_DOWN) >>> context.create_decimal_from_float(math.pi) # Decimal('3.1415') >>> context = Context(prec=5, traps=[Inexact]) >>> context.create_decimal_from_float(math.pi) # Traceback (most recent call last): # ... # decimal.Inexact: None
Etiny()
:Возвращает значение, равное Emin - prec + 1
, которое является минимальным показателем степени для ненормальных результатов. При возникновении недостаточного значения показатель степени устанавливается на Etiny
.
Etop()
:Возвращает значение, равное Emax - prec + 1
.
Обычный подход к работе с десятичными знаками заключается в создании экземпляров Decimal()
и последующем применении арифметических операций, которые выполняются в текущем контексте для активного потока.
Альтернативный подход заключается в использовании методов контекста для расчета в конкретном контексте. Методы аналогичны тем, которые используются для класса Decimal()
. Класс Context()
определяет большое количество методов для выполнения арифметики непосредственно в данном контексте, которые здесь не рассматриваются
Кроме того, для каждого метода класса Decimal()
, за исключением методов Decimal.аdjust()
и Decimal.аs_tuple()
, существует соответствующий метод Context()
.