Что является результатом целочисленного деления десятичной дроби?

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

4/0.4 = 10.0
4//0.4 = 9.0

Обычное деление дает 10, но целочисленное деление 4 на 0,4 дает 9,0.

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

// - это деление на пол, а не "целочисленное деление".
user2357112 supports Monica 18.02.2019 07:12

Согласно официальный справочник Python 3 оператор // — это разделение этажей, а не целочисленное деление (как вообще может работать целочисленное деление с использованием нецелочисленных значений?). Что касается результата, см. Математика с плавающей запятой сломана?.

Some programmer dude 18.02.2019 07:12

Возможный дубликат Математика с плавающей запятой сломана?

Andras Deak 18.02.2019 07:19

Комбинируйте с stackoverflow.com/questions/183853/… для полного эффекта.

Andras Deak 18.02.2019 07:21

Возможный дубликат В чем разница между «/» и «//» при использовании для деления?

Felix Martinez 18.02.2019 09:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
569
1

Ответы 1

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

Другие вопросы по теме