2013-11-14 7 views
9

Ich habe an einem Skript gearbeitet, das Daten aus einer XLS-Tabelle übernimmt, die Zahlen rundet und den Dezimalpunkt entfernt, zB: 2606.89579999999 wird 26069; Allerdings brauche ich die Zahl auf zwei Dezimalstellen zu runden, selbst wenn es eine nacheilende Null wäre, so sollte 2606.89579999999 260690 werden.Rundung einer Zahl in Python, aber endende Nullen

Ich habe es derzeit so i nimmt die Daten aus der Zelle in Excel, und runden es ab zwei Dezimalstellen (i = round(i, 2)), die mir im obigen Beispiel die einzige Dezimalstelle gibt.

Ich habe versucht herauszufinden, wie man dies mit Decimal arbeiten, aber ich kann nicht scheinen, es funktioniert zu bekommen.

Alle anderen Zahlen, die gerundet werden, wenn der gerundete Wert nicht in '0' endet, funktionieren gut mit round(i, 2), aber wenn die Zahlen so einfach in * .x0 enden, wird diese 0 fallengelassen und durcheinander gebracht die Daten.

+0

Ich glaube, ich Ich habe es gerade herausgefunden - mit 'i = ('% .2f'% i) scheint es zu funktionieren. Ich werde es mit anderen Zahlen testen, um zu überprüfen, ob es funktioniert –

+1

2606.89579999999 sollte 260690 oder 2606.90 werden? – shantanoo

+0

@SethKoberg Ich habe meine Antwort mit Dezimalbeispiel aktualisiert, wenn du das irgendwie verpasst hast (bearbeitet viel um klarer und präziser zu sein) – alko

Antwort

16

Wie Sie über nachfolgende Nullen sprechen, dann ist dies eine Frage über Darstellung als String, Sie

>>> "%.2f" % round(2606.89579999999, 2) 
'2606.90' 

Nutzen modernen Stil mit format Funktion verwenden können:

>>> '{:.2f}'.format(round(2606.89579999999, 2)) 
'2606.90' 

und entfernen Punkt mit replace oder translate (_ verweist auf das Ergebnis des vorherigen Befehls in der Python-Konsole):

>>> _.translate(None, '.') 
'260690' 

Beachten Sie, dass Rundungs ​​hier nicht benötigt wird, als .2f Format applyies die gleiche Rundung:

>>> "%.2f" % 2606.89579999999 
'2606.90' 

Aber wie Sie Excel erwähnt, würden Sie wahrscheinlich entscheiden, um Ihre eigene Rundungsfunktion zu rollen, oder decimal verwenden, wie float.round kann aufgrund schweben Darstellung zu seltsamen Ergebnissen führen:

>>> round(2.675, 2) 
2.67 
>>> round(2606.89579999999, 2) 
2606.89 

Mit dezimal Verwendung quantize:

>>> from decimal import * 
>>> x = Decimal('2606.8950000000001') 
# Decimal('2606.8950000000001') 
>>> '{}'.format(x.quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN)) 
'2606.90' 

Das, für Ihre ursprüngliche Aufgabe wird:

>>> x = Decimal('2606.8950000000001') 
>>> int((x*100).quantize(1, rounding=ROUND_HALF_EVEN)) 
260690 

Und der Grund fremder Runden kommt nach vorne mit Decimal:

>>> x = Decimal(2606.8950000000001) 
# Decimal('2606.89499999999998181010596454143524169921875') # internal float repr 
+0

Keine Notwendigkeit für den 'runden' Aufruf: das' .2f' wird schon die Rundung für dich erledigen. –

+0

'% .2f' macht bereits die Rundung für Sie, Sie können also auch verwenden:' "% .2f"% (2606.89579999999) 'oder' format (2606.89579999999, '.2f ') ' –

+0

@MarkDickinson war nicht sicher, dass es genau auf die gleiche Weise rundet, was es tatsächlich tut – alko

3
>>> '{:.2f}'.format(2606.89579999999).replace('.', '') 
'260690' 
0
>>> int (round (2606.89579999999,2)*100) 
260690 
+0

Schlechte Idee. '>>> int (rund (0.29, 2) * 100)' -> '28'. –

Verwandte Themen