2010-01-07 5 views
7

// «целочисленное деление» оператор Python удивил меня сегодня:Целочисленное подразделение по сравнению с напольным фактором: почему этот неожиданный результат?

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

documentation читает «(этажные) фактор х и у». Итак, почему math.floor (11/1.1) равно 10, но 11 // 1.1 равно 9?

+5

http://mail.python.org/pipermail/python-dev/2007-January/070707.html – miku

+0

Канонический вопрос для разности делений Python 2-vs-3 [Как заставить деление быть плавающей точкой в Python? Отдел продолжает округлять до 0] (https://stackoverflow.com/questions/1267869/how-can-i-force-division-to-be-floating-point-in-python-division-keeps-rounding) – smci

ответ

5

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

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

Под Python 2 типа в консоли:

>>> 1.1 
1.1000000000000001 

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

Но:

>>> 11/1.1 
10.0 

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

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

+0

Но в соответствии с Python '11.0/1.1 == 10.0' является истинным – sth

+1

Как известно, 1.1 хранится как 1.1000000000000001, поэтому результат 11.0/1.1 в Python равен 9.999999999999999090909090909, но ближайший поплавок к этому числу - infact 10.0, так что бывает так, что результат точно 10.0 –

+0

@ Тит я думал об этом, и я считаю, что это ключ к разнице между math.floor (11/1.1) и 11 // 1.1. Однако, как заметил гнибблер, тот факт, что 1.1 представлен немного большим числом, указывает только на то, что math.floor (11/1.1) действительно должен быть 9.0, что оставляет исходный вопрос открытым. – EOL