Это происходит из-за питон округления целочисленного деления. Ниже приведены несколько примеров. В python тип float
является более сильным типом и выражениями, содержащими float
и int
, для оценки float
.
>>> 5/2
2
>>> -5/2
-3
>>> -5.0/2
-2.5
>>> 5.0/2
2.5
>>> -5//2
-3
Чтобы обойти округление, вы можете использовать это свойство; и вместо этого выполнить расчет с float
, чтобы не потерять точность. Затем с помощью math module вернуть потолок этого числа (затем преобразовать -> Int снова):
>>> import math
>>> int(math.ceil(-5/float(2)))
-2
Вы можете найти свой лучший путь. См. Объяснение Гвидо [здесь] (http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html) – tdelaney
Это просто * неожиданно * или * на самом деле проблематично *? Python ведет себя так, потому что для '-5% 2' более полезно дать' 1', чем '-1', а' -5/2 == - 3' более соответствует '-5% 2 == 1' чем '-5/2 == - 2'. Если вам нужно, чтобы ваш результат соответствовал интерпретации операций других языков, '-5/2 == - 3' может быть проблемой, но в остальном это обычно отлично. – user2357112