Runde bis zur Zweiten Dezimalstelle in Python
Wie kann ich das Runden einer Zahl auf die zweite Nachkommastelle in python? Zum Beispiel:
0.022499999999999999
Sollte die Runde bis zu 0.03
0.1111111111111000
Sollte die Runde bis zu 0.12
Wenn es irgendeinen Wert in der Dritten Dezimalstelle, ich will es immer in der Runde und ließen mich 2 Werte hinter dem Komma.
- Ich würde vorschlagen zu Lesen Floating-Point-Arithmetik: Probleme und Einschränkungen aus der Python-tutorial, bevor Sie gehen.
- Überlegen Sie auch, ob Sie wirklich wollen, um Runde Werte sein, oder Sie wollen einfach nur die Anzeige mit 3 Nachkommastellen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python umfasst die
round()
Funktion, die können Sie angeben die Anzahl der Ziffern, die Sie wollen. Aus der Dokumentation:So würden Sie wollen, um
round(x, 2)
zum normalen Rundung. Um sicherzustellen, dass die Zahl immer gerundet bis müssten Sie dieceil(x)
Funktion. Ebenso in Runde unten Verwendungfloor(x)
.ceil
würde bedeuten, kopieren, deine Antwort lasse ich mir als (fast) ist und upvoting verkaufen.Finden Sie unter:
math.ceil
- Dokumentationround
- Dokumentation - Sie werden wahrscheinlich wollen, check this out, jedenfalls für zukünftige Referenzround()
hier-es ändert nicht das Ergebnis in keiner Weise.math.ceil((1.11 * 100.0)) / 100.0
kommt heraus1.12
Weil:1.11 * 100.0
Wert111.00000000000001
decimal
- Modul wenn Sie brauchen genaue dezimale Ergebnisse.Extrapolation von Edwin Antwort:
Verwenden:
math.ceil((1.11 * 100.0)) / 100.0
kommt heraus1.12
Weil:1.11 * 100.0
Wert111.00000000000001
Dies hängt von dem Verhalten, das Sie wollen, wenn man positive und negative zahlen, aber wenn Sie wollen etwas, das immer Runden auf einen größeren Wert (z.B. 2.0449 -> 2.05, -2.0449 -> -2.04) dann kannst du das tun:
oder ein wenig schicker:
Dieser scheint auch zu funktionieren wie folgt:
Beachten Sie, dass die
ceil(num * 100) /100
trick-crash auf einige degenerierte Eingaben, wie 1e308. Dieser kann nicht kommen oft, aber ich kann Ihnen sagen, es nur kostet mich ein paar Tage. Um dies zu vermeiden, "wäre es schön, wenn"ceil()
undfloor()
nahm einen Dezimalstellen argument, wieround()
tut... Inzwischen weiss jemand eine saubere alternative, die nicht Abstürzen, auf Eingaben wie das? Ich hatte einige Hoffnungen für diedecimal
- Paket, aber es scheint zu sterben, zu:Natürlich könnte man sagen, der Absturz ist die einzige vernünftige Verhalten auf solche Einträge, aber ich würde behaupten, dass es nicht die Rundung, sondern die Multiplikation, die das problem verursacht (das ist, warum, z.B., 1e306 nicht abstürzt), und eine sauberere Umsetzung der rund-um-bis-N-TEN-Platz fn-würde vermeiden, dass die Multiplikation hack.
Decimal
ist, dass das Ergebnis der Quantisierung Ausdruck braucht 311 Ziffern zum Ausdruck zu bringen, und die aktuelle Genauigkeit ist zu klein. Wenn Sie einefrom decimal import getcontext; getcontext().prec = 400
im Vorfeld, diese "arbeiten", für einen Wert von "Arbeit". Oder Sie können beachten Sie, dass alle Schwimmer, die größer als 2**52 im absoluten Wert muss bereits eine ganze Zahl, so dass die Rundung wird keine Wirkung haben. Und ja, ich Stimme zu, es wäre schön, wenn "ceil" und "Boden" hat eine Nachkommastellen argument.Die Runde funtion angegeben funktioniert nicht, definitiv für Ganzzahlen wie :
aber funktioniert für :
Ausserdem die Nachkommastellen wie 2.675 abgerundet sind, als nicht 2.67 2.68.
Besser verwenden Sie die andere Methode, die oben bereitgestellt.
Python
round
Funktion Rundung, die Art und Weise nicht erwartet.Können Sie mehr über die spezifischen Rundung-Methode, indem Sie
Decimal.quantize
zB.
Referenz:
https://gist.github.com/jackiekazil/6201722