>>> a = 1.05
>>> a
1.05
>>> Decimal(a)
Decimal('1.0500000000000000444089209850062616169452667236328125')
>>> Decimal(str(a))
Decimal('1.05')

я искренне не понимаю, почему питон при работе с флоатом сначала работает нормально, а как только нужно сконвертировать в Decimal сразу вспоминает, что у флоата существует погрешность и суёт её в результат :blobcatheadachent:

@mo Decimal.from_float(0.1) is not the same as Decimal('0.1'). Since 0.1 is not exactly representable in binary floating point, the value is stored as the nearest representable value which is 0x1.999999999999ap-4. That equivalent value in decimal is 0.1000000000000000055511151231257827021181583404541015625.

Note

From Python 3.2 onwards, a Decimal instance can also be constructed directly from a float.

@johan спасибо, гении, я знаю что там под капотом. Претензия к неконсистентности поведения

Follow

@mo Сорри, я не погромист, но где в описанной ситуации «работает нормально» и где «ненормально»?

Decimal, как я понимаю, хранит число в виде именно десятичных цифирок. А str округляет по дефолту 17 (вроде) знаков. Поэтому

>>> str(Decimal(".1"))
'0.1'
>>> str(Decimal(.1))
'0.1000000000000000055511151231257827021181583404541015625'

И это по крайней мере логично, не?

@johan
>>> a = 1.05
>>> a
1.05
^^^^^^^^^^^
вот здесь работает нормально

>>> Decimal(a)
Decimal('1.0500000000000000444089209850062616169452667236328125')
^^^^^^^^^^^^^^^
вот здесь ненормально

Вопросов бы не было, если бы он работал "ненормально" в обоих случаях. Но когда в одном случае он округляет, а в другом нет — это плохо, это неконсистентность.

К слову, как мне сказали, он округляет на уровне str(), то есть питон просто втихаря берет и заметает погрешность флоатов под ковер. Явное лучше неявного, верно?

@mo
>>> a = 1.05
>>> a
1.05
>>> format(a, ".18f")
'1.050000000000000044'

Да, по дефолту округляет
>>> a = 1.050000000000000044
>>> a
1.05

Sign in to participate in the conversation
CleverLibre Social

CleverLibre Social is an inclusive social instance for open discussion, learning, and community.
All cultures welcome.
Hate speech and harassment strictly forbidden.