2016-01-05 11 views
5

Ich bin ein wenig verwirrt darüber, wie Rundung in Python funktioniert.
Könnte jemand bitte erklären, warum sich Python so verhält?Wie funktioniert das Runden in Python?

Beispiel:

>>> round(0.05,1) # this makes sense 
0.1 
>>> round(0.15,1) # this doesn't make sense! Why is the result not 0.2? 
0.1 

Und gleiche gilt für:

>>> round(0.25,1) # this makes sense 
0.3 
>>> round(0.35,1) # in my opinion, should be 0.4 but evaluates to 0.3 
0.3 

Edit: So in der Regel gibt es eine Möglichkeit, dass Python abrundet statt auf der Rundung. Also muss ich verstehen, dass die einzige "abnorme" Sache, die passieren kann, ist, dass Python abgerundet wird? Oder kann es aufgrund der Lagerung "abnormal" aufgerundet werden?

+0

Verwandte. 'Print '% .20f% .20f% .20f' % (15, .25, .35) ' –

+0

@Rob_phi: Nicht bezogen werden: Ihr Index phi ist richtig, auch in der URL-Anzeige in meiner Adressleiste wiedergegeben [wenn ich Ihre Benutzername klicken] ... WIE?!? – gariepy

+0

@gariepy Wenn Sie die URL in einen Texteditor kopieren wird es zeigen sich als 'http: // stackoverflow.com/users/8747/rob% E1% B5% A9' - einige Browser wie Chrome machen die entkam Unicode-Zeichen in die URL-Leiste. – Galax

Antwort

12

Dies ist eigentlich durch Design (ich habe nicht einen Fall, wo Python aufgerundet, wenn ich es erwartet abrunden gefunden). Von Pythons' documentation:

Das Verhalten von round() für Schwimmer kann überraschend sein: zum Beispiel round(2.675, 2) gibt 2,67 statt der erwarteten 2,68. Dies ist kein Bug: es ist ein Ergebnis der Tatsache, dass die meisten Dezimalbrüchen nicht exakt als Schwimmer vertreten sein.

+1

Nun, das ist scheiße. –

+5

Yep, insbesondere „0,15“ wird intern als '0.1499999999999999944488848768742172978818416595458984375' repräsentiert, und„0,35“ist' 0.34999999999999997779553950749686919152736663818359375'. Beides halbwegs abgerundet. – Kevin

+0

Im Allgemeinen gibt es eine Möglichkeit, dass es abgerundet statt aufgerundet wird. Das einzige "abnormale" Ding, das passieren kann, ist, dass es abgerundet wird? Oder kann es aufgrund der Lagerung "abnormal" aufgerundet werden? (Ich habe nicht einen Fall gefunden, wo es aufgerundet wird, wenn ich es bekommen abgerundet erwarten.) –

3

Als Beispiel ist hier ein Fall, in dem Sie erhalten Aufrundung:

>>> round(0.0499999999999999999,1) 
0.1 

In diesem Fall 17 „9“ s die Mindestzahl sind, dieses Verhalten zu verursachen. Dies liegt daran, dass die interne Darstellung von 0.0499999999999999999 0.05000000000000000277555756156289135105907917022705078125 ist.

7

Es mir klingt wie Sie brauchen das decimal Modul:

from decimal import * 
x = Decimal('0.15') 
print x.quantize(Decimal('0.1'), rounding=ROUND_HALF_UP) 

Ausgang:

0.2 
+1

@JonasKaufmann: Wenn Sie genaue Dezimaldarstellungen benötigen, was sich so anhört wie Sie, ist dies die richtige Antwort. Aus diesem Grund wurde Cobol erfunden. Und. Immer noch. Im. Benutzen. :( – gariepy