Сообщить об ошибке.

Объекты контекста модуля decimal

Контексты - это среды для арифметических операций. Они определяют точность, устанавливают правила округления, определяют, какие сигналы рассматриваются как исключения, и ограничивают диапазон для показателей.

Каждый поток имеет свой текущий контекст, доступ к которому можно изменить или изменить с помощью функций decimal.getcontext() и decimal.setcontext():

Содержание:


decimal.getcontext():

Функция decimal.getcontext() возвращает текущий контекст для активного потока. текущий контекст можно изменять, присваивая атрибутам класса decimal.Context() другие значения.

>>> import decimal
>>> decimal.getcontext()
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
#         capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero,
#         InvalidOperation])

# Установка новой точности на месте
>>> decimal.getcontext().prec = 7

decimal.setcontext(c):

Функция decimal.setcontext() устанавливает текущий контекст для активного потока в c.

>>> 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)
>>> decimal.setcontext(C)
>>> decimal.getcontext()
# Context(prec=5, rounding=ROUND_UP, Emin=-999999, 
#         Emax=999999, capitals=1, clamp=0, flags=[], 
#         traps=[InvalidOperation, DivisionByZero, Overflow])

Вы также можете использовать оператор with и функцию decimal.localcontext() для временного изменения активного контекста.

decimal.localcontext(ctx=None):

Функция decimal.localcontext() возвращает диспетчер контекста, который установит текущий контекст для активного потока в копию ctx при входе в оператор with и восстанавливает предыдущий контекст при выходе из оператора with. Если контекст не указан, используется копия текущего контекста.

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

from decimal import localcontext

with localcontext() as ctx:
    # Выполнить расчет высокой точности
    ctx.prec = 42
    s = calculate_something()
# Округлить окончательный результат до точности по умолчанию
s = +s

decimal.BasicContext:

Класс decimal.BasicContext это стандартный контекст, определенный "Общей десятичной арифметической спецификацией". Точность установлена ​​до девяти. Округление установлено в decimal.ROUND_HALF_UP. Все флаги очищены. Все ловушки включены и рассматриваются как исключения, за исключением неточных, округляемых и субнормальных.

Поскольку многие ловушки включены, этот контекст полезен для отладки.

decimal.ExtendedContext:

Класс decimal.ExtendedContext это стандартный контекст, определенный "Общей десятичной арифметической спецификацией". Точность установлена ​​до девяти. Округление установлено в decimal.ROUND_HALF_EVEN. Все флаги очищены. Ловушки не включены, чтобы исключения не возникали во время вычислений.

Поскольку прерывания отключены, этот контекст полезен для приложений, которые предпочитают иметь значение результата NaN или Infinity и не вызывать исключения. Это позволяет приложению завершить расчеты при наличии условий, которые в противном случае остановили бы программу.

decimal.DefaultContext:

Класс decimal.DefaultContext этот контекст используется конструктором decimal.Context() в качестве прототипа для новых контекстов. Изменение поля точность приводит к изменению значения по умолчанию для новых контекстов, созданных конструктором контекста decimal.Context().

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

В однопоточных средах предпочтительно вообще не использовать этот контекст. Вместо него просто явно создайте контексты.

Значения по умолчанию: prec=28, rounding=ROUND_HALF_EVEN и разрешенные прерывания для переполнения, InvalidOperation и DivisionByZero.