>>> 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
Qoto Mastodon

QOTO: Question Others to Teach Ourselves
An inclusive, Academic Freedom, instance
All cultures welcome.
Hate speech and harassment strictly forbidden.