Angenommen, ich habe 8.8333333333333339
und ich möchte es konvertieren in 8.84
. Wie kann ich dies in Python erreichen?
round(8.8333333333333339, 2)
gibt 8.83
und nicht 8.84
. Ich bin neu in Python oder Programmieren im Allgemeinen.
Ich möchte es nicht als Zeichenfolge drucken, und das Ergebnis wird weiter verwendet. Weitere Informationen zum Problem finden Sie in Tim Wilsons Python-Programmiertipps: Kredit- und Zahlungsrechner .
python
floating-point
hsinxh
quelle
quelle
Antworten:
8.833333333339
(oder8.833333333333334
das Ergebnis von106.00/12
) richtig auf zwei Dezimalstellen gerundet ist8.83
. Mathematisch klingt es so, als ob Sie eine Deckenfunktion wollen . Der in Pythonsmath
Modul heißtceil
:Die Boden- und Deckenfunktionen ordnen im Allgemeinen eine reelle Zahl der größten vorherigen oder kleinsten folgenden Ganzzahl zu, die keine Dezimalstellen hat. Um sie also für 2 Dezimalstellen zu verwenden, wird die Zahl zuerst mit 10 2 multipliziert (oder 100) , um die Dezimalstelle zu verschieben Punkt und wird dann danach durch ihn geteilt, um zu kompensieren.
Wenn Sie das
math
Modul aus irgendeinem Grund nicht verwenden möchten , können Sie diese (minimal getestete) Implementierung verwenden, die ich gerade geschrieben habe:Wie dies auf das Problem des verknüpften Kredit- und Zahlungsrechners zutrifft
Aus der Beispielausgabe geht hervor, dass sie die monatliche Zahlung aufgerundet haben , was viele als Effekt der Deckenfunktion bezeichnen. Dies bedeutet, dass jeden Monat etwas mehr als 1 ⁄ 12 des Gesamtbetrags gezahlt werden. Dadurch war die Restzahlung etwas geringer als gewöhnlich - und es blieb nur ein Restbetrag von unbezahlt
8.76
.Es wäre gleichermaßen gültig gewesen, eine normale Rundung zu verwenden, die eine monatliche Zahlung von
8.83
und eine etwas höhere Restzahlung von ergibt8.87
. In der realen Welt möchten die Menschen jedoch im Allgemeinen nicht, dass ihre Zahlungen erhöht werden. Daher ist es üblich, jede Zahlung aufzurunden. Außerdem wird das Geld schneller an den Kreditgeber zurückgegeben.quelle
Dies ist normal (und hat nichts mit Python zu tun), da 8.83 nicht genau als binärer Float dargestellt werden kann, ebenso wie 1/3 nicht genau als Dezimalzahl dargestellt werden kann (0.333333 ... ad infinitum).
Wenn Sie absolute Präzision gewährleisten möchten, benötigen Sie das
decimal
Modul:quelle
print
Funktion / Anweisung verwenden (abhängig von Ihrer Python-Version).>>> 106.00/12 => 8.833333333333334
Sie möchten das Dezimalmodul verwenden, müssen aber auch den Rundungsmodus angeben. Hier ist ein Beispiel:
quelle
Eine viel einfachere Möglichkeit besteht darin, einfach die Funktion round () zu verwenden. Hier ist ein Beispiel.
Wenn Sie jetzt total_price ausdrucken würden, würden Sie bekommen
Aber wenn Sie es in eine round () - Funktion wie diese einschließen
Die Ausgabe ist gleich
Die Funktion round () akzeptiert zwei Parameter. Die erste ist die Zahl, die Sie runden möchten. Die zweite ist die Anzahl der Dezimalstellen, auf die gerundet werden soll.
quelle
Wenn Sie 8,8333333333339 auf 2 Dezimalstellen runden, lautet die richtige Antwort 8,83 und nicht 8,84. Der Grund, warum Sie 8.83000000001 erhalten haben, ist, dass 8.83 eine Zahl ist, die in Binärform nicht korrekt wiedergegeben werden kann, und dass Sie die nächstgelegene erhalten. Wenn Sie es ohne alle Nullen drucken möchten, gehen Sie wie folgt vor:
quelle
Der einfachste Weg, dies zu tun, ist die Verwendung der folgenden integrierten Funktion:
Beispielsweise:
Die Ausgabe wäre:
Ähnlich:
Würde geben:
quelle
Wenn Sie runden möchten, ist 8,84 die falsche Antwort. 8,833333333333 gerundet ist 8,83 nicht 8,84. Wenn Sie immer aufrunden möchten, können Sie math.ceil verwenden. Führen Sie beides in Kombination mit der Formatierung von Zeichenfolgen aus, da das Runden einer Gleitkommazahl selbst keinen Sinn ergibt.
quelle
Nur für das Protokoll. Sie könnten es so machen:
Es sind keine Einschlüsse / Importe erforderlich
quelle
Hier ist meine Lösung für das Round-Up / Down-Problem
quelle
Ich habe diesen Code:
und dann dieser Code:
Runde hat für mich funktioniert
quelle
renewal_percentage=round(df_x_renewal_count/df_all_count*100)
Verwenden Sie das
decimal
Modul: http://docs.python.org/library/decimal.htmlََََََ
quelle
Hier ist eine einfache Funktion, um dies für Sie zu tun:
Hier ist num die Dezimalzahl. x ist die Dezimalstelle bis zu der Stelle, an der Sie eine schwebende Zahl runden möchten.
Der Vorteil gegenüber anderen Implementierungen besteht darin, dass Nullen am rechten Ende der Dezimalstelle gefüllt werden können, um eine Deziamzahl mit bis zu x Dezimalstellen zu erhalten.
Beispiel 1:
wird zurückkehren
10.200000000 (bis zu 9 Dezimalstellen)
Beispiel 2:
wird zurückkehren
10,22 (bis zu zwei Dezimalstellen)
quelle