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.