Я знаю, что ошибки округления происходят в арифметике с плавающей запятой, но кто-нибудь может объяснить причину этого:
>>> 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)
ЗАМЕЧАНИЕ: Я полагаю, что более глубокая причина, по которой это не работает, состоит в том, что разделение по этажам является прерывистым и, следовательно, имеет бесконечное число условий, что делает его некорректной задачей. Числа деления по этажам и числа с плавающей точкой просто несовместимы, и вы никогда не должны использовать // для чисел с плавающей точкой. Просто используйте целые числа или дроби вместо этого.