decimal

>>> import decimal
>>> x = decimal.Decimal(‘3.4’)
>>> y = decimal.Decimal(‘4.5’)
>>> x * y
decimal.Decimal(‘15.30’)
>>> x / y
decimal.Decimal(‘0.7555555555555555555555555556’)
>>> decimal.getcontext().prec = 3 # Изменить точность и повторить вычисления
>>> x * y
decimal.Decimal(‘15.3’)
>>> x / y
decimal.Decimal(‘0.756’)

# Изменить точность только для одного блока инструкций

with decimal.localcontext(decimal.Context(prec=10)):
    e = x * y   # decimal.Decimal(‘15.30’)
    f = x / y   # decimal.Decimal(‘0.7555555556’)
class Decimal([value[, context]])

значение числа может быть представлено как:

  • целое

  • строка “4.5”

  • кортеж (sign, digits, exponent)

    • sign - 0|1, положительное|отрицательное
    • digits - кортеж в виде целых чисел
    • exponent - целочисленная экспонента

контекст передается в виде объекта Context()

>>> a = decimal.Decimal(42)
# Decimal(“42”)
>>> a = decimal.Decimal(“37.45”)
# Decimal(“37.45”)
>>> a = decimal.Decimal((1,(2,3,4,5),-2))
# Decimal(“-23.45”)
>>> decimal.Decimal(“Infinity”)
# бесконечность
>>> decimal.Decimal(“NaN”)
# не число
exp([context])

Натуральная степень e ** d

fma(y, z[, context])

self * y + z без округления результата x*y

ln([context])

Натуральный логарифм (по основанию e) числа self

log10([context])

Десятичный логарифм числа self

sqrt([context])

Корень квадратный из числа self

class Contexn(prec=None, rounding=None, traps=None, flags=None, Emin=None, Emax=None, capitals=1)

Контекст для работы с дробными десятичными числами. Обычно новые объекты класса Context не создаются непосредственно. Для этого используются функция getcontext() или localcontext(), возвращающая текущий объект Context.

Параметры:
  • prec (int) – количество цифр после десятичной точки
  • rounding – порядок округления
  • traps – список сигналов, которые возбуждают исключения в различных обстоятельствах (например, при попытке выполнить деление на ноль)
  • flags – список сигналов, свидетельствующих о начальном состоянии контекста (например, переполнение). Обычно аргумент flags не указывается.
  • Emin (int) – минимальное значения экспоненты
  • Emax (int) – максимальное значения экспоненты
  • capitals (int) – какой символ, ‘E’ или ‘e’, должен использоваться для обозначения экспоненты. По умолчанию имеет значение 1 (‘E’).

Порядки округления

  • ROUND_CEILING - Округление в сторону положительной бесконечности. Например, число 2.52 будет округлено до 2.6, а число –2.58 до –2.5.
  • ROUND_DOWN - Округление в сторону нуля. Например, число 2.58 будет округлено до 2.5, а число –2.58 – до -2.5.
  • ROUND_FLOOR - Округление в сторону отрицательной бесконечности. Например, число 2.52 будет округлено до 2.5, а число –2.58 до –2.6.
  • ROUND_HALF_DOWN - Округление в сторону от нуля, если округляемая часть больше половины последнего значимого разряда, в противном случае округление будет выполнено в сторону нуля. Например, число 2.58 будет округлено до 2.6, число 2.55 будет округлено до 2.5, а число –2.58 до –2.6.
  • ROUND_HALF_EVEN - То же, что и ROUND_HALF_DOWN, только если округляемая часть равна точно половине последнего значимого разряда, результат округляется вниз, если предыдущая цифра четная, и вверх – если предыдущая цифра нечетная. Например, число 2.65 будет округлено до 2.6, число 2.55 также будет округлено до 2.6.
  • ROUND_HALF_UP - То же, что и ROUND_HALF_DOWN, только если округляемая часть равна точно половине последнего значимого разряда, результат округляется в сторону от нуля. Например, число 2.55 будет округлено до 2.6, а число –2.55 до –2.6.
  • ROUND_UP - Округление в сторону от нуля. Например, число 2.52 будет округлено до 2.6, а число –2.52 – до –2.6.
  • ROUND_05UP - Округление в сторону от нуля, если последний значимый разряд содержит цифру 0 или 5, в противном случае округление выполняется в сторону нуля. Например, число 2.54 будет округлено до 2.6, число 2.64 также будет округлено до 2.6.

Типы сигналов

Сигнал Описание
Clamped Экспонента была откорректирована в соответствии с допустимым диапазоном.
DivisionByZero Деление небесконечного числа на 0.
Inexact Погрешность округления.
InvalidOperation Выполнена недопустимая операция.
Overflow После округления экспонента превысила значение Emax. Также генерирует сигналы Inexact и Rounded.
Rounded Округление выполнено. Может появиться, если при округлении точность представления числа не пострадала (например, при округлении «1.00» до «1.0»).
Subnormal Перед округлением экспонента была меньше значения Emin.
Underflow Потеря значащих разрядов числа. Результат операции был округлен до 0. Также генерирует сигналы Inexact и Subnormal.

Иерархия сигналов

  • ArithmeticError (встроенное исключение)
    • DecimalException
      • Clamped
      • DivisionByZero
    • Inexact
      • Overflow
      • Underflow
    • InvalidOperation

    • Rounded
      • Overflow
      • Underflow
    • Subnormal
      • Underflow
clear_flags()

Сбрасывает все флаги

copy()

Возвращает копию контекста

create_decimal(value)

Создает новый объект Decimal, используя контекст. Это может пригодиться, когда потребуется создавать числа, точность представления и правила округления для которых должны отличаться от установленных по умолчанию.

class BasicContext

Предопределенный контекст с точностью до девяти знаков после десятичной точки. Использует правило округления ROUND_HALF_UP; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; разрешены все сигналы, кроме Inexact, Rounded и Subnormal.

class DefaultContext

Контекст по умолчанию, который используется при создании нового контекста (то есть значения параметров этого контекста используются как значения по умолчанию для параметров нового контекста). Определяет точность до 28 знаков после десятичной точки; округление ROUND_HALF_EVEN; включает флаги Overflow, InvalidOperation и DivisionByZero.

class ExtendedContext

Предопределенный контекст с точностью до девяти знаков после десятичной точки. Использует правило округления ROUND_HALF_EVEN; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; все сигналы запрещены. Никогда не возбуждает исключения, но в результате операций может возвращаться значение NaN или Infinity.

class Inf

То же, что и Decimal(“Infinity”).

class negInf

То же, что и Decimal(“-Infinity”).

class NaN

То же, что и Decimal(“NaN”).

getcontext()

возвращает текущий объект Context

localcontext([c])

Создает менеджера контекста, который устанавливает контекст в качестве текущего для тела with. Без аргумента возвращает копию текущего контекста.

>>> with localcontext() as c:
        c.prec = 5
        # инструкции
setcontext(c)

Устанавливает контекст для потока выполнения.

Примеры

>>> a = Decimal(“42.5”)
>>> b = Decimal(“37.1”)
>>> a + b
Decimal(“79.6”)
>>> a / b
Decimal(“1.145552560646900269541778976”)
>>> divmod(a,b)
(Decimal(“1”), Decimal(“5.4”))
>>> max(a,b)
Decimal(“42.5”)
>>> c = [Decimal(“4.5”), Decimal(“3”), Decimal(“1.23e3”)]
>>> sum(c)
Decimal(“1237.5”)
>>> [10*x for x in c]
[Decimal(“45.0”), Decimal(“30”), Decimal(“1.230e4”)]
>>> float(a)
42.5
>>> str(a)
‘42.5’
>>> getcontext().prec = 4
>>> a = Decimal(“3.4562384105”)
>>> a
Decimal(“3.4562384105”)
>>> b = Decimal(“5.6273833”)
>>> getcontext().flags[Rounded]
0
>>> a + b
9.084
>>> getcontext().flags[Rounded]
1
>>> a / Decimal(“0”)
Traceback (most recent call last):
File “<stdin>”, line 1, in ?
decimal.DivisionByZero: x / 0
>>> getcontext().traps[DivisionByZero] = False
>>> a / Decimal(“0”)
Decimal(“Infinity”)