Реализация CPython для деления числа с плавающей точкой на число с плавающей точкой в качестве делителя или делителя лежит в функции float_floor_div
, которая вызывает функцию float_divmod
(который реализует функцию divmod
) для фактического расчета, которая со следующими строками кода:
mod = fmod(vx, wx);
div = (vx - mod) / wx;
...
floordiv = floor(div);
говорит вам, что способ, которым разделение по полу работает для числа с плавающей запятой, заключается в том, чтобы сначала вызвать *Функция 1011 * для получения остатка от деления, вычитания остатка из делимого 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.3999999999999998 вместо 0, и, как результат, с помощью способа float_divmod
, вычисляющего частное, сначала вычитая остаток из дивиденда, вы получаете:
>>> 4 - 4 % 0.4
3.6
так естественно,
>>> (4 - 4 % 0.4) / 0.4
9.0