Sie möchten Ihre Antwort abrunden.
round(value,significantDigit)
ist die übliche Lösung, um dies zu tun, jedoch funktioniert dies manchmal nicht so, wie man es aus mathematischer Sicht erwarten würde, wenn die Ziffer, die der Ziffer, auf die Sie runden, unmittelbar unter (links von) liegt, eine hat 5
.
Hier 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
Angenommen, Sie beabsichtigen, die traditionelle Rundung für Statistiken in den Wissenschaften durchzuführen, ist dies ein praktischer Wrapper, damit die round
Funktion wie erwartet funktioniert und import
zusätzliche Dinge wie erforderlich sind Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Auf dieser Grundlage können wir also eine Funktion erstellen ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Grundsätzlich fügt dies der Zeichenfolge einen wirklich kleinen Wert hinzu, um zu erzwingen, dass sie in unvorhersehbaren Fällen, in denen sie normalerweise nicht mit der round
Funktion übereinstimmt, wenn Sie dies erwarten , ordnungsgemäß aufgerundet wird. Ein praktischer Mehrwert zu schaffen ist , 1e-X
wo X
die Länge der Zahlenfolge ist sind Sie zu verwenden versuchen , round
auf Plus 1
.
Der Ansatz der Verwendung 10**(-len(val)-1)
war bewusst, da er die größte kleine Zahl ist, die Sie hinzufügen können, um die Verschiebung zu erzwingen, und gleichzeitig sicherstellt, dass der hinzugefügte Wert die Rundung niemals ändert, selbst wenn die Dezimalstelle .
fehlt. Ich könnte nur 10**(-len(val))
mit einer Bedingung verwenden, if (val>1)
um 1
mehr zu subtrahieren ... aber es ist einfacher, immer die zu subtrahieren, 1
da dies den anwendbaren Bereich von Dezimalzahlen, mit dem diese Problemumgehung richtig umgehen kann, nicht wesentlich ändert. Dieser Ansatz schlägt fehl, wenn Ihre Werte die Grenzen des Typs erreichen. Dies schlägt fehl, aber für fast den gesamten Bereich gültiger Dezimalwerte sollte er funktionieren.
Der fertige Code lautet also wie folgt:
def main():
printC(formeln(typeHere()))
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!\n"))
except ValueError:
print "\nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
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 "\nYour Celsius value is " + answer + " C.\n"
main()
... sollte Ihnen die Ergebnisse liefern, die Sie erwarten.
Sie können auch die Dezimalbibliothek verwenden, um dies zu erreichen. Der von mir vorgeschlagene Wrapper ist jedoch einfacher und kann in einigen Fällen bevorzugt werden.
Edit: Danke Blckknght für den Hinweis, dass der Randfall hier5
nur für bestimmte Werte auftritt .