2016-07-26 14 views
1

In Python versuche ich eine ganze Zahl durch die Hälfte zu teilen und ich stieß auf zwei verschiedene Ergebnisse basierend auf dem Vorzeichen der Zahl.Python Division Operator gibt verschiedene Ergebnisse

Beispiel:

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

Wie kommt man -2, wenn ich -5/2 teilen?

+5

Sie können seine den besseren Weg finden. Siehe Guidos Erklärung [hier] (http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html) – tdelaney

+1

Ist das * nur * unerwartet * oder * wirklich problematisch *? Python verhält sich so, weil es für '-5% 2' sinnvoller ist, '1' als' -1' zu geben, und '-5/2 ==-3' ist konsistenter mit' -5% 2 == 1' als '-5/2 == - 2' wäre. Wenn Sie möchten, dass Ihre Ausgabe mit den Interpretationen anderer Sprachen übereinstimmt, ist "-5/2 == - 3" möglicherweise ein Problem, aber ansonsten ist es normalerweise völlig in Ordnung. – user2357112

Antwort

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

'math.ceil' wird immer abgerundet, anstatt auf Null zu runden. Wahrscheinlich nicht, was das OP für '5/2' will –

+0

Ich habe keine Ahnung was OP will, ich zeigte ihm nur, wie er' -2 bekommen konnte wenn ich -5/2 teile ' – ritlew

1

Dies geschieht, um Python durch Abrunden ganzzahlige Division. Unten sind ein paar Beispiele. In Python ist der float Typ der stärkere Typ und Ausdrücke, die float und int zu float bewerten.

>>> 5/2 
2 
>>> -5/2 
-3 
>>> -5.0/2 
-2.5 
>>> 5.0/2 
2.5 
>>> -5//2 
-3 

Um die Rundung zu umgehen, könnten Sie diese Eigenschaft nutzen; und führen Sie stattdessen eine Berechnung mit float durch, um die Genauigkeit nicht zu verlieren. Dann math module verwenden, um die Decke dieser Zahl zurück (dann konvertieren -> int wieder):

>>> import math 
>>> int(math.ceil(-5/float(2))) 
-2 
+5

nichts davon beantwortet die Frage – ritlew

+0

Beantwortet jetzt , tippte es immer noch ha, hoffentlich änderst du deine Meinung über den Downvote! @ritlew – ospahiu

+0

'math.ceil' scheint im letzten Beispiel überflüssig. Wie in meiner Antwort erwähnt, reicht die Verwendung der Float Division mit anschließender Umwandlung in int aus. Welchen Vorteil hat die Verwendung von 'ceil' in diesem Fall? – mhoff

2

Sie sollten wie Teilung in Ausdruck umschließen unter

print -(5/2) 
+3

Dies funktioniert nur, weil Sie den negativen unären Operator * nach * der Ganzzahl-Division anwenden. Es wird nicht als allgemeine Lösung funktionieren, wo "5" oder "2" Variablen sind. –

1

Sie müssen Schwimmer Division verwenden und dann int verwenden die dezimalen

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

In Python 3, float Teilung zu trunkieren ist Standard und Sie müssen die from __future__ import division nicht einschließen. Alternativ können Sie auch manuell einen der Werte ein Schwimmer machen float Teilung zu zwingen

>>> -5/2.0 
-2.5 
+0

Wenn Sie aus irgendeinem Grund die Division nicht von '__future__' importieren möchten, können Sie folgendes tun:' int (float (-5)/2) ' – dashiell

+0

Sie nehmen jedoch einen Präzisionstreffer, wenn Sie dies mit großen Ganzzahlen verwenden . – user2357112

+0

@ user2357112 Ich nehme an, wenn Sie Ganzzahlen größer als '10^18' verwenden. –

Verwandte Themen