Почему 1 // 0.1 == 9.0?
В питоне 2.7
а также 3.x
почему целочисленное деление дает мне неправильное число при делении на число 0 < x < 1
?
Отрицательные числа -1 < x < 0
даже правильно работать
>>> 1//.1
9.0
>>> 1//-.1
-10.0
Я понимаю, что целочисленное деление с отрицательным (или положительным) числом округляет в сторону отрицательной бесконечности, однако я бы подумал 1//.1
должно привести к 10.0
поскольку 1
можно разделить на .1
без остатка.
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