Vuoi arrotondare la tua risposta.
round(value,significantDigit)
è la soluzione ordinaria per farlo, tuttavia a volte questo non funziona come ci si aspetterebbe da una prospettiva matematica quando la cifra immediatamente inferiore (a sinistra di) alla cifra che stai arrotondando ha un 5
.
Ecco alcuni esempi di questo comportamento imprevedibile:
>>> 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
Supponendo che il tuo intento sia quello di fare il tradizionale arrotondamento per le statistiche nelle scienze, questo è un pratico wrapper per far round
funzionare la funzione come previsto, necessitando di import
cose extra come Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Quindi in base a questo possiamo fare una funzione ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Fondamentalmente questo aggiunge un valore molto piccolo alla stringa per costringerlo ad arrotondare correttamente nelle istanze imprevedibili dove normalmente non ha la round
funzione quando ci si aspetta. Un valore conveniente da aggiungere è 1e-X
dov'è X
la lunghezza della stringa numerica che stai cercando di usare round
su più 1
.
L'approccio dell'uso è 10**(-len(val)-1)
stato deliberato, in quanto è il numero più piccolo che è possibile aggiungere per forzare lo spostamento, garantendo anche che il valore aggiunto non cambi mai l'arrotondamento anche se .
manca il decimale . Potrei usare solo 10**(-len(val))
con un condizionale if (val>1)
per sottrarre di 1
più ... ma è più semplice sottrarre sempre il 1
dato che non cambierà molto l'intervallo applicabile di numeri decimali che questa soluzione alternativa può gestire correttamente. Questo approccio fallirà se i tuoi valori raggiungono i limiti del tipo, questo fallirà, ma per quasi l'intero intervallo di valori decimali validi dovrebbe funzionare.
Quindi il codice finito sarà simile a:
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()
... dovrebbe darti i risultati che ti aspetti.
Puoi anche usare la libreria decimale per farlo, ma il wrapper che propongo è più semplice e può essere preferito in alcuni casi.
Modifica: Grazie Blckknght per aver sottolineato che il 5
caso marginale si verifica solo per determinati valori qui .