2017-05-21 7 views
0

ich diesen Code bin mit:Runde Schwimmer auf 2 Stellen nach dem Punkt in Python

f = 0.3223322 
float('%.2f' % (f)) 

Gibt es mehr pythonic, weniger ausführlich Verfahren ohne 2 Gussteile? round Verwendung ist durch die folgende Notiz aus der Dokumentation

Das Verhalten von rund() entmutigend für Schwimmer überraschend sein kann: zum Beispiel rund (2.675, 2) ergibt 2,67 statt der erwarteten 2,68. Dies ist kein Bug: Es ist ein Ergebnis der Tatsache, dass die meisten Dezimalbrüche nicht genau wie ein Float dargestellt werden können. Weitere Informationen finden Sie unter Gleitkommaarithmetik: Probleme und Einschränkungen.

+2

Beachten Sie, dass 'float ('%. 2f'% f)' genau das gleiche Problem wie 'round() 'hat. Das ist, weil die Dokumentation sagt, dass es eine Beschränkung der Art ist, auf der Fließkomma-Punkte auf Computern funktionieren. Ich würde mir in den meisten Situationen keine Sorgen machen. Für den Fall, dass es wichtig ist, denke ich, dass es besser ist, das "Dezimal" -Modul oder das "Brüche" -Modul oder eine beliebige Präzisionsbibliothek zu verwenden, abhängig vom exakten Anwendungsfall. –

+0

Wofür versuchst du dich zu treffen? – Ryan

Antwort

2

round(number[, ndigits]):

>>> round(0.3223322, 2) 
0.32 

Beachten Sie, dass Sie wahrscheinlich noch eine gewisse Präzision der Zeichenfolge Formatierung verwenden möchten, wenn der Ausgang aufgrund Gleitkomma Unschärfen zu erzeugen.

Je nachdem, was Sie versuchen zu erreichen, könnte es angemessen sein, den Decimal Typen zu verwenden:

>>> from decimal import Decimal 
>>> round(Decimal(0.3223322), 2) 
Decimal('0.32') 

die ihre Mathe tut in (! Überraschung) dezimal statt binären und deshalb nicht leiden Probleme mit Dezimalrundung (außer anfangs, wenn Sie versuchen, es aus einem Gleitkomma zu erstellen).

1

Was ist falsch mit guten alten, eingebaut in round()?

Verwenden Sie es wie folgt:

round(input, digits) 

Beispiel Ausgabe:

>>> f = 0.3223322 
>>> round(f, 2) 
0.32 
0

Das ist nicht so schön, aber ich bin immer ein Fan von:

f=float(int(100*f))/100 

Weit davon entfernt, der beste Weg, es zu tun, aber es ist eine, die ich oft benutze.

0

ich mit round() gehen würde, aber wenn Sie wie sein Verhalten nicht, können Sie immer Ihre eigenen round() so schreiben, aus Gründen der Vollständigkeit:

def custom_round(number, ndigits=2): 
    return int(number * 10 ** ndigits)/10.0 ** ndigits if ndigits else int(number) 

, dass diese Runde Denken Sie daran, im Gegensatz zu dem eingebaut round() rundet ab, nicht auf.

Verwandte Themen