Decimal: почему при prec=3 получается 1.23
@python_quizРазберем этот квиз
Короткое условие — в коде используется Decimal и глобальный контекст точности:

Ожидаемый вывод программы:

Ключевая идея — prec задаёт число значащих цифр
getcontext().prec управляет числом значащих (significant) цифр при арифметических операциях с Decimal. Это не количество цифр после запятой, а общее число цифр, начиная с первой ненулевой слева.
В нашем примере:
- Точное арифметическое значение суммы: 1.2345 + 0.0004 = 1.2349.
- При
prec = 3нужно оставить 3 значащие цифры в числе 1.2349. Значащие цифры — это "1", "2", "3" (далее стоит "4" — следующий разряд). - Так как следующий разряд (четвёртый значащий) равен 4 (<5), округление ведёт к уменьшению: 1.2349 -> 1.23.
По умолчанию режим округления — ROUND_HALF_EVEN, но здесь он не задействован, потому что цифра для округления меньше 5.
Разбор вариантов (логика)
- Вариант с выводом 1.23 Decimal('1.23') соответствует поведению контекста
prec=3— результат округлён до 3 значащих цифр. - Вариант с 1.235 Decimal('1.235') означал бы, что число округлено вверх до 1.235 (что не соответствует исходной цифре 4 на позиции для округления).
- Вариант с 1.2349 Decimal('1.2349') подразумевает отсутствие округления; но контекст
prec=3применяет округление к результату операции. - Вариант 1.234 Decimal('1.234') означал бы усечение/другое округление вниз до трёх значащих цифр с сохранением другой позиции — тоже неверно для данного правила округления.
Наглядные дополнительные примеры
Покажем, как поведение меняется при разных prec и при создании Decimal из float (чтобы избегать двоичных погрешностей, обычно используют строки):

Ожидаемый вывод:

И пример с float (показывает, почему лучше передавать строки в Decimal):

Выводы и советы
- getcontext().prec задаёт число значащих цифр в результатах арифметики Decimal.
- Для точного и детерминированного поведения создавайте Decimal из строк, а не из float.
- Помните про режим округления (по умолчанию ROUND_HALF_EVEN) — он важен для граничных случаев, когда следующая цифра равна 5.
Этот пример наглядно показывает разницу между количеством значащих цифр и количеством знаков после запятой — и почему результат выглядит как 1.23 при prec=3.