Chcesz zaokrąglić swoją odpowiedź.
round(value,significantDigit)
jest zwykłym rozwiązaniem tego problemu, jednak czasami nie działa to tak, jak można by się tego spodziewać z perspektywy matematycznej, gdy cyfra bezpośrednio gorsza (na lewo od) cyfry, którą zaokrąglasz, ma 5
.
Oto kilka przykładów tego nieprzewidywalnego zachowania:
>>> 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
Zakładając, że Twoim celem jest wykonanie tradycyjnego zaokrąglania dla statystyk w nauce, jest to przydatne opakowanie, aby round
funkcja działała zgodnie z oczekiwaniami i wymagała import
dodatkowych rzeczy Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Na tej podstawie możemy wykonać funkcję ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Zasadniczo dodaje to naprawdę niewielką wartość do łańcucha, aby zmusić go do poprawnego zaokrąglenia w górę w nieprzewidywalnych przypadkach, w których zwykle nie działa z round
funkcją, gdy się tego spodziewasz. Wygodną wartością do dodania jest to, 1e-X
gdzie X
jest długość ciągu liczbowego, którego próbujesz użyć round
na plus 1
.
Podejście polegające na użyciu 10**(-len(val)-1)
było celowe, ponieważ jest to największa mała liczba, jaką można dodać, aby wymusić przesunięcie, jednocześnie zapewniając, że dodana wartość nigdy nie zmienia zaokrąglenia, nawet jeśli .
brakuje dziesiętnego . Mógłbym użyć tylko 10**(-len(val))
warunku, if (val>1)
aby odjąć 1
więcej ... ale łatwiej jest po prostu zawsze odjąć, 1
ponieważ nie zmieni to zbytnio odpowiedniego zakresu liczb dziesiętnych, które to obejście może poprawnie obsłużyć. To podejście zakończy się niepowodzeniem, jeśli twoje wartości osiągną granice danego typu, to się nie powiedzie, ale dla prawie całego zakresu prawidłowych wartości dziesiętnych powinno działać.
Tak więc gotowy kod będzie podobny do:
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()
... powinien dać oczekiwane rezultaty.
Aby to zrobić, możesz również użyć biblioteki dziesiętnej , ale proponuję opakowanie jest prostsze i może być preferowane w niektórych przypadkach.
Edit: Dzięki Blckknght dla wskazując, że 5
sprawa frędzle występuje tylko dla pewnych wartości tutaj .