почему деление чисел с плавающей точкой с помощью Decimal не всегда корректно

Например, если я считаю 0.123866/10000

import decimal

decimal.getcontext().prec = 20

a = decimal.Decimal('0.123866')
b = decimal.Decimal("10000")

print(a / b)

Данный код выдаст 0.0000123866

Но если я буду делить 0.000866/10000 , то ответ будет 8.66E-8

Почему так происходит, и что делать? (Версия Python 3.12)


Ответы (1 шт):

Автор решения: Amgarak

Почему так происходит, и что делать?

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

from decimal import Decimal, getcontext
getcontext().prec = 10

a = Decimal('86667679679567956')
b = Decimal("10000567965756")

print(format((a * b), 'f')) # 866726021100000000000000000000
print(a * b) # 8.667260211E+29

Фактически 8.66E-8 == 0.0000000866 , а следовательно вычисления произведены корректно.

Поправить вывод можно так:

f"{a / b:.10f}" или format((a / b), 'f')
→ Ссылка