Vous voulez arrondir votre réponse.
round(value,significantDigit)
est la solution ordinaire pour ce faire, mais cela ne fonctionne parfois pas comme on pourrait s'y attendre d'un point de vue mathématique lorsque le chiffre immédiatement inférieur (à gauche de) le chiffre auquel vous arrondissez a un5
.
Voici quelques exemples de ce comportement imprévisible:
>>> 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
En supposant que votre intention est de faire l'arrondi traditionnel pour les statistiques dans les sciences, c'est un wrapper pratique pour faire round
fonctionner la fonction comme prévu, nécessitant import
des choses supplémentaires comme Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Ah! Donc, sur cette base, nous pouvons faire une fonction ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Fondamentalement, cela ajoute une très petite valeur à la chaîne pour la forcer à arrondir correctement sur les instances imprévisibles où elle n'est pas normalement avec la round
fonction lorsque vous vous y attendez. Une valeur pratique à ajouter est 1e-X
où X
est la longueur de la chaîne numérique que vous essayez d'utiliser round
sur plus 1
.
L'approche de l'utilisation a 10**(-len(val)-1)
été délibérée, car c'est le plus grand petit nombre que vous pouvez ajouter pour forcer le décalage, tout en garantissant que la valeur que vous ajoutez ne change jamais l'arrondi même si la décimale .
est manquante. Je pourrais utiliser juste 10**(-len(val))
avec une conditionnelle if (val>1)
pour soustraire 1
plus ... mais il est plus simple de toujours soustraire 1
car cela ne changera pas beaucoup la plage applicable de nombres décimaux que cette solution de contournement peut gérer correctement. Cette approche échouera si vos valeurs atteignent les limites du type, cela échouera, mais pour presque toute la plage de valeurs décimales valides, cela devrait fonctionner.
Ainsi, le code fini sera quelque chose comme:
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()
... devrait vous donner les résultats que vous attendez.
Vous pouvez également utiliser la bibliothèque décimale pour accomplir cela, mais le wrapper que je propose est plus simple et peut être préféré dans certains cas.
Edit: Merci Blckknght d' avoir souligné que le 5
cas de frange ne se produit que pour certaines valeurs ici .