>>> 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’)
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
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
, используя контекст. Это может пригодиться, когда потребуется создавать числа, точность представления и правила округления для которых должны отличаться от установленных по умолчанию.
BasicContext
Предопределенный контекст с точностью до девяти знаков после десятичной точки. Использует правило округления ROUND_HALF_UP; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; разрешены все сигналы, кроме Inexact, Rounded и Subnormal.
DefaultContext
Контекст по умолчанию, который используется при создании нового контекста (то есть значения параметров этого контекста используются как значения по умолчанию для параметров нового контекста). Определяет точность до 28 знаков после десятичной точки; округление ROUND_HALF_EVEN; включает флаги Overflow, InvalidOperation и DivisionByZero.
ExtendedContext
Предопределенный контекст с точностью до девяти знаков после десятичной точки. Использует правило округления ROUND_HALF_EVEN; параметр Emin имеет значение -999999999; параметр Emax имеет значение 999999999; все сигналы запрещены. Никогда не возбуждает исключения, но в результате операций может возвращаться значение NaN или Infinity.
Inf
То же, что и Decimal(“Infinity”).
negInf
То же, что и Decimal(“-Infinity”).
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”)