Я не уверен, как целочисленное деление на самом деле работает с десятичным числом. Учитывая эти два примера на Python 3.x:
4/0.4 = 10.0
4//0.4 = 9.0
Обычное деление дает 10, но целочисленное деление 4 на 0,4 дает 9,0.
Знаете ли вы поведение целочисленного деления с десятичным числом и почему результат такой?
Согласно официальный справочник Python 3 оператор // — это разделение этажей, а не целочисленное деление (как вообще может работать целочисленное деление с использованием нецелочисленных значений?). Что касается результата, см. Математика с плавающей запятой сломана?.
Возможный дубликат Математика с плавающей запятой сломана?
Комбинируйте с stackoverflow.com/questions/183853/… для полного эффекта.
Возможный дубликат В чем разница между «/» и «//» при использовании для деления?






Реализация CPython нижнего деления числа с плавающей запятой как делимого или делителя заключается в функции float_floor_div, которая вызывает функцию float_divmod (которая реализует функцию divmod) для фактического вычисления, которое со следующими строками кода :
mod = fmod(vx, wx);
div = (vx - mod) / wx;
...
floordiv = floor(div);
говорит вам, что деление пола работает для числа с плавающей запятой: сначала нужно вызвать функцию fmod, чтобы получить остаток от деления, вычесть остаток из делимого vx, а затем разделить его на делитель wx, прежде чем применять функцию floor на полученное частное div.
И если вы попытаетесь выполнить операцию по модулю 4 % 0.4, ожидая, что это будет 0, потому что 4 / 0,4 математически должно быть 10:
>>> 4 % 0.4
0.3999999999999998
Вы увидите классический плавающая ошибка, присущий тому, как десятичные числа аппроксимируются двоичной системой. В результате 0,4 на самом деле хранится как нечто немного большее, чем 0,4, в чем вы можете убедиться, создав экземпляр высокоточного объекта Decimal с 0,4:
>>> from decimal import Decimal
>>> Decimal(0.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
вот почему 4 % 0,4 имеет остаток 0,39999999999999998 вместо 0, и в результате, с учетом того, как float_divmod вычислил частное, сначала вычитая остаток из делимого, вы получаете:
>>> 4 - 4 % 0.4
3.6
так естественно,
>>> (4 - 4 % 0.4) / 0.4
9.0
//- это деление на пол, а не "целочисленное деление".