2017-10-03 1 views
-2

Dieser Code rundet 1,5 (Wert = 15) auf 2, sondern rundet 144,5 (Wert = 1445) auf 144. Ich verstehe nicht warum.Python Rounding Confusion

def rounders(value): 
    count = 0 
    while value >= 10: 
     value = round(value/10, 0) 
     count += 1 
    return value * (10 ** count) 

Dies ist mein Versuch, die Herausforderung der Codefights "Rounders" zu lösen. Unten ist eine Erklärung, was versucht wird.

Beispiel

Für Wert = 15, sollte die Ausgabe rounders sein (Wert) = 20;

Für Wert = 1234, sollte die Ausgabe rounders (Wert) sein = 1000

1234 -> 1230 -> 1200 -> 1000

Für Wert = 1445, sollte die Ausgabe sein rounders (Wert) = 2000.

1445 -> 1450 -> 1500 -> 2000

+0

Ist das Python 2 oder 3? – sberry

Antwort

1

Diese Frage zu Strange behavior of numpy.round sehr ähnlich ist. Was dort geschrieben wird über np.round zum builtin round Methode von Python 3. Hinweis unmittelbar anwendbar ist, dass das Verhalten von Python 2 unterscheidet (wie oben im Beitrag beschrieben. Dank ShadowRanger dass für den Hinweis auf.)

Haben Sie einen Blick auf die documentation der round Methode:

Wenn zwei Multiples gleich nahe sind, Rundung in Richtung der sogar Wahl erfolgt.

Das heißt,

round(2.5) == 2 
round(3.5) == 4 

Sie können eine Rundungsmethode mit dem intuitiven Verhalten schreiben mit einer einfachen if-Anweisung:

def myRound(x): 
    r = x % 1 
    if r < 0.5: 
     return x-r 
    else: 
     return x-r+1 
+2

Randbemerkung: Dieser Rundungsmodus wird oft als "Runde halbe gerade" -Modus bezeichnet, und es ist nützlich für unvoreingenommenes Runden in finanziellen Kontexten (Sie wollen nicht, dass Ihre Bank immer zu seinen Gunsten abgerundet) und zur Vermeidung von Kaskadierungsfehlern (Das wiederholte Runden in der gleichen Richtung in einer langen Berechnung vergrößert die Fehler; die Rundung in Richtung auf die Gerade neigt dazu, sich auszugleichen). Wenn Sie mehr Kontrolle benötigen, können Sie 'decimal.Decimal' Werte verwenden, mit denen Sie den Kontext auf * Wählen * Ihren [bevorzugten Rundungsmodus] (https://docs.python.org/3/library/decimal) optimieren können. html # rounding-modes), um Ihrem gewünschten Verhalten zu entsprechen. – ShadowRanger

+2

Beachten Sie auch, dass "Runde" den runden Halb-Gerade-Modus nur für Py3 verwendet; [bei Py2 ist der Modus "rund" halbiert] (https://docs.python.org/2/library/functions.html#round) (die Hälften sind von 0 abgerundet, also "-0,5") -> '-1.0' und' 0.5' -> '1.0') und gibt immer' float' zurück (wobei Py3 'int' zurückgibt, wenn das zweite Argument nicht angegeben ist). – ShadowRanger