Целочисленное деление по сравнению с настеленным пол частным: почему этот неожиданный результат?

// сегодня оператор "целочисленного деления" 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?

9
задан smci 14 October 2016 в 05:11
поделиться

1 ответ

Потому что 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, если вам нужна такая точность.

6
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: