2016-07-26 4 views
1

В Python Я пытаюсь разделить целое число на половину, и я наткнулся на два разных результата, основанных на знаке числа.Оператор разделения Python дает разные результаты

Пример:

5/2 gives 2 
and 
-5/2 gives -3 

Как получить -2, когда я делю -5/2?

+5

Вы можете найти свой лучший путь. См. Объяснение Гвидо [здесь] (http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html) – tdelaney

+1

Это просто * неожиданно * или * на самом деле проблематично *? Python ведет себя так, потому что для '-5% 2' более полезно дать' 1', чем '-1', а' -5/2 == - 3' более соответствует '-5% 2 == 1' чем '-5/2 == - 2'. Если вам нужно, чтобы ваш результат соответствовал интерпретации операций других языков, '-5/2 == - 3' может быть проблемой, но в остальном это обычно отлично. – user2357112

ответ

0
>>> import math 
>>> math.ceil(float(-5)/2) 
-2.0 
+3

'math.ceil' всегда округляется, вместо округления к нулю. Наверное, не то, что хочет OP для '5/2' –

+0

Я понятия не имею, что нужно оператору, я просто показал ему, как он может« получить -2, когда я делюсь -5/2' – ritlew

1

Это происходит из-за питон округления целочисленного деления. Ниже приведены несколько примеров. В 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 
+5

, ничто из этого не отвечает на вопрос – ritlew

+0

Отвечено сейчас , все еще печатал его, надеюсь, вы измените свое мнение о downvote! @ritlew – ospahiu

+0

'math.ceil' кажется лишним в последнем примере. Как уже упоминалось в моем ответе, использование float-деления с последующим преобразованием в int достаточно. В чем преимущество использования 'ceil' в этом случае? – mhoff

2

Вы должны заключить разделение в выражении, как показано ниже

print -(5/2) 
+3

Это работает только потому, что вы применяете отрицательный унарный оператор * после * целочисленного деления. Он не будет работать как общее решение, где переменные '5' или' 2'. –

1

Вы должны использовать поплавок разделение а затем использовать int укоротить десятичной

>>> from __future__ import division 
>>> -5/2 
-2.5 
>>> int(-5/2) 
-2 

в Python 3, поплавок разделение является по умолчанию, и вам не нужно включать from __future__ import division. Кроме того, вы можете вручную сделать одно из значений с плавающей точкой, чтобы заставить флоат деление

>>> -5/2.0 
-2.5 
+0

Если по какой-либо причине вы не хотите импортировать деление из '__future__', вы могли бы сделать:' int (float (-5)/2) ' – dashiell

+0

Вы принимаете прецизионный хит, если используете его с большими целыми числами , – user2357112

+0

@ user2357112 Я полагаю, если вы используете целые числа, превышающие '10^18'. –