Что является результатом деления целого числа на десятичное? - PullRequest
0 голосов
/ 18 февраля 2019

Я не уверен, как целочисленное деление работает с десятичной дробью.Рассматривая эти два примера для Python 3.x:

4/0.4 = 10.0
4//0.4 = 9.0

Регулярное деление дает 10, но целочисленное деление 4 на 0,4 дает 9,0.

Знаете ли вы поведение целочисленного деления с десятичной и почему результат такой?

1 Ответ

0 голосов
/ 18 февраля 2019

Реализация 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
...