677 Stimmen

Wie rundet man auf 2 Dezimalstellen mit Python?

Ich erhalte viele Dezimalstellen im Ausgabewert dieses Codes (Fahrenheit in Celsius Umwandler).

Mein aktueller Code sieht so aus:

def main():
    printC(formeln(typeHere()))

def typeHere():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hallo! Gib den Fahrenheit-Wert ein und erhalte ihn in Celsius!\n"))
    except ValueError:
        print "\nDeine Eingabe war keine Zahl!"
        print "Wir haben deinen Fahrenheit-Wert auf 50 gesetzt!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return round(Celsius, 2)

def printC(answer):
    answer = str(answer)
    print "\nDein Celsius-Wert beträgt " + answer + " C.\n"

main()

Also meine Frage ist, wie kann ich das Programm dazu bringen, jede Antwort auf die 2. Dezimalstelle zu runden?

21voto

Jason R. Mick Punkte 5037

Sie möchten Ihre Antwort rund machen.

round(Wert,signifikanteZiffer) ist die übliche Lösung dafür, allerdings funktioniert dies manchmal nicht wie man es aus mathematischer Sicht erwarten würde, wenn die unmittelbar niedrigere Ziffer (links von) der Ziffer, zu der Sie runden möchten, eine 5 hat.

Hier sind einige Beispiele für dieses unvorhersehbare Verhalten:

>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01

Wenn Ihre Absicht darin besteht, das traditionelle Runden für statistische Zwecke in den Naturwissenschaften durchzuführen, ist dies ein praktisches Wrapper, um die round-Funktion wie erwartet zu nutzen, ohne zusätzliche Dinge wie Decimal importieren zu müssen.

>>> round(0.075,2)

0.07

>>> round(0.075+10**(-2*6),2)

0.08

Aha! Basierend darauf können wir eine Funktion erstellen...

def roundTraditional(val,digits):
   return round(val+10**(-len(str(val))-1), digits)

Grundsätzlich fügt dies einen sehr kleinen Wert zum String hinzu, um ihn in den unvorhersehbaren Fällen, in denen die round-Funktion nicht ordnungsgemäß rundet, wenn man es erwartet, ordnungsgemäß aufzurunden. Ein praktischer Wert, den man hinzufügen kann, ist 1e-X, wobei X die Länge des Zahlenstrings ist, den Sie mit round verwenden möchten, plus 1.

Der Ansatz, 10**(-len(val)-1) zu verwenden, wurde bewusst gewählt, da dies die größte kleine Zahl ist, die Sie hinzufügen können, um die Verschiebung zu erzwingen, und gleichzeitig sicherstellen, dass der hinzugefügte Wert das Runden nicht ändert, auch wenn das Dezimalzeichen . fehlt. Ich könnte einfach 10**(-len(val)) verwenden und mit einer Bedingung if (val>1) ein weiteres 1 abziehen ... aber es ist einfacher, einfach immer das 1 abzuziehen, da dies die anwendbare Bandbreite von Dezimalzahlen, die diese Workaround ordentlich verarbeiten kann, nicht wesentlich verändert. Dieser Ansatz scheitert, wenn Ihre Werte die Grenzen des Typs erreichen, dies wird versagen, aber für nahezu den gesamten Bereich gültiger Dezimalwerte sollte dies funktionieren.

Der fertige Code sieht also so aus:

def main():
    printC(formeln(hierTyp()))

def roundTraditional(val,digits):
    return round(val+10**(-len(str(val))-1))

def hierTyp():
    global Fahrenheit
    try:
        Fahrenheit = int(raw_input("Hi! Geben Sie den Fahrenheit-Wert ein und erhalten Sie ihn in Celsius!\n"))
    except ValueError:
        print "\nIhre Eingabe war keine Zahl!"
        print "Wir haben Ihren Fahrenheit-Wert auf 50 gesetzt!"
        Fahrenheit = 50
    return Fahrenheit

def formeln(c):
    Celsius = (Fahrenheit - 32.00) * 5.00/9.00
    return Celsius

def printC(answer):
    answer = str(roundTraditional(answer,2))
    print "\nIhr Celsius-Wert beträgt " + answer + " C.\n"

main()

...sollte die von Ihnen erwarteten Ergebnisse liefern.

Sie können auch die decimal Bibliothek verwenden, um dies zu erreichen, aber der von mir vorgeschlagene Wrapper ist einfacher und in einigen Fällen bevorzugt.


Bearbeitung: Danke an Blckknght, der darauf hingewiesen hat, dass der 5 Randfall nur für bestimmte Werte auftritt hier.

21voto

Samuel Dauzon Punkte 9838

Wenn Sie das Problem mit der Fließkommadarstellung beim Runden von Zahlen für die Buchhaltung vermeiden möchten, können Sie numpy round verwenden.

Sie müssen numpy installieren:

pip install numpy

und den Code:

import numpy as np

print(round(2.675, 2))
print(float(np.round(2.675, 2)))

druckt

2.67
2.68

Sie sollten das verwenden, wenn Sie Geld mit legalen Rundungen verwalten.

13voto

Mahadi Punkte 131
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))

12voto

Wenn Sie nicht nur ein gerundetes Ergebnis benötigen, sondern auch mathematische Operationen mit dem gerundeten Ergebnis durchführen möchten, können Sie decimal.Decimal verwenden https://docs.python.org/2/library/decimal.html

from decimal import Decimal, ROUND_DOWN

Decimal('7.325').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('7.32')

11voto

Roman Punkte 1759
von Dezimalimport Dezimal, ROUND_HALF_UP

# Hier sind alle Optionen zum Runden:
# Diese bietet die meisten Steuerungsmöglichkeiten von Anfang an
# ROUND_05UP       ROUND_DOWN       ROUND_HALF_DOWN  ROUND_HALF_UP
# ROUND_CEILING    ROUND_FLOOR      ROUND_HALF_EVEN  ROUND_UP

unser_wert = Dezimal(16.0/7)
ausgabe = Dezimal(unser_wert.quantize(Dezimal('.01'), 
rounding=ROUND_HALF_UP))
print ausgabe

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X