Я знаю, что ошибки округления происходят в арифметике с плавающей запятой, но кто-нибудь может объяснить причину этого:
>>> 8.0 / 0.4 # as expected
20.0
>>> floor(8.0 / 0.4) # int works too
20
>>> 8.0 // 0.4 # expecting 20.0
19.0
Это происходит как на Python 2, так и на 3 на x64.
Насколько я понимаю, это либо ошибка, либо очень тупая спецификация //
, поскольку я не вижу причин, по которым последнее выражение должно оцениваться как 19.0
.
Почему a // b
не определяется просто как floor(a / b)
?
РЕДАКТИРОВАТЬ: 8.0 % 0.4
также оценивается как 0.3999999999999996
. По крайней мере, это является следствием, так как тогда 8.0 // 0.4 * 0.4 + 8.0 % 0.4
оценивается как 8.0
РЕДАКТИРОВАТЬ: это не дубликат математики с плавающей запятой не работает?, поскольку я спрашиваю, почему эта конкретная операция подвержена ошибкам округления (возможно, их можно избежать), и почему a // b
не определен как/равно floor(a / b)
ЗАМЕЧАНИЕ: Я полагаю, что более глубокая причина, по которой это не работает, состоит в том, что разделение по этажам является прерывистым и, следовательно, имеет бесконечное число условий, что делает его некорректной задачей. Числа деления по этажам и числа с плавающей точкой просто несовместимы, и вы никогда не должны использовать //
для чисел с плавающей точкой. Просто используйте целые числа или дроби вместо этого.