//
сегодня оператор "целочисленного деления" 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.1 не может быть точно представлено в двоичной форме; аппроксимация немного больше, чем 1.1 - поэтому результат деления слишком мал.
Попробуйте следующее:
На питоне 2, введите в консоли:
>>> 1.1
1.1000000000000001
На питоне 3.1, на консоли отобразится 1.1
, но внутренне это все равно то же самое число.
Но:
>>> 11/1.1
10.0
Как указывает гнибблер, это результат "внутреннего округления" в пределах доступных пределов точности поплавков. И как указывает в своем комментарии MYYN, //
использует другой алгоритм для вычисления результата деления на этаж, чем math.floor()
, чтобы сохранить a == (a//b)*b + a%b
как можно лучше.
Используйте тип Decimal
, если вам нужна такая точность.