Ответ 1
То, что вы видите здесь, по сути, является следствием разницы между "нормальным" делением с использованием /
и деления пола с помощью //
.
Также важно иметь в виду общую проблему с арифметикой с плавающей запятой, которая является определенной неточностью только из-за того, как они работают. В таких ситуациях всегда полезно использовать модуль decimal
, чтобы проверить, что происходит на самом деле. Поэтому давайте посмотрим, что вы здесь делаете:
Прежде всего, .1
уже не является точным:
>>> Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Итак, давайте посмотрим на фактический результат делений:
>>> Decimal(1) / Decimal(.1)
Decimal('9.999999999999999444888487687')
>>> 1 / .1
10.0
Как вы можете видеть, нормальное деление с использованием /
точно не дает вам 10
с арифметикой с плавающей запятой. Но это действительно близко. Вот почему, когда вы используете обычные поплавки, вы действительно получаете обратно 10 (так как неточность деления сразу теряется при неточности номера номера).
При использовании разделки полов результат перекрывается до исправления неточности, поэтому вы получаете 9
:
>>> Decimal(1) // Decimal(.1)
Decimal('9')
>>> 1 / .1
10.0
С отрицательными цифрами эффект напольного покрытия - это противоположное направление, как описано в этом другом вопросе:
>>> Decimal(1) / Decimal(-.1)
Decimal('-9.999999999999999444888487687')
>>> 1 / -.1
-10.0
>>> Decimal(1) // Decimal(-.1)
Decimal('-9')
>>> 1 // -.1
-10.0