Целочисленное деление по сравнению с выложенным частным: почему этот удивительный результат? - PullRequest
9 голосов
/ 07 января 2010

Оператор Python "целочисленное деление" // удивил меня сегодня:

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0

Документация гласит "(с полами) отношение x и y". Итак, почему math.floor (11 / 1.1) равен 10, а 11 // 1.1 равен 9?

1 Ответ

6 голосов
/ 07 января 2010

Потому что 1.1 нельзя точно представить в двоичном виде; аппроксимация немного выше, чем 1,1 - поэтому результат деления слишком мал.

Попробуйте следующее:

В Python 2 введите в консоли:

>>> 1.1
1.1000000000000001

В Python 3.1 консоль будет отображать 1.1, но внутри это все тот же номер.

Но:

>>> 11/1.1
10.0

Как указывает Гнибблер, это является результатом "внутреннего округления" в пределах доступных пределов точности поплавков. И, как указывает MYYN в своем комментарии, // использует другой алгоритм для вычисления результата деления по этажам, чем math.floor(), чтобы сохранить a == (a//b)*b + a%b как можно лучше.

Используйте тип Decimal, если вам нужна эта точность.

...