Quieres redondear tu respuesta.
round(value,significantDigit)
es la solución ordinaria para hacer esto, sin embargo, esto a veces no funciona como cabría esperar desde una perspectiva matemática cuando el dígito inmediatamente inferior (a la izquierda de) el dígito que está redondeando tiene un 5
.
Aquí hay algunos ejemplos de este comportamiento impredecible:
>>> 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
Suponiendo que su intención es hacer el redondeo tradicional para las estadísticas en las ciencias, este es un útil contenedor para que la round
función funcione como se espera y necesita import
cosas adicionales como Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
¡Ajá! Entonces, en base a esto, podemos hacer una función ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Básicamente, esto agrega un valor realmente pequeño a la cadena para obligarla a redondearse correctamente en las instancias impredecibles donde normalmente no round
funciona con la función cuando lo espera. Un valor conveniente para agregar es 1e-X
dónde X
está la longitud de la cadena de números que está tratando de usar round
en más 1
.
El enfoque de uso 10**(-len(val)-1)
fue deliberado, ya que es el número pequeño más grande que puede agregar para forzar el cambio, al tiempo que garantiza que el valor que agregue nunca cambie el redondeo, incluso si .
falta el decimal . Podría usar solo 10**(-len(val))
con una condición if (val>1)
para restar 1
más ... pero es más simple restar siempre, 1
ya que eso no cambiará mucho el rango aplicable de números decimales que esta solución puede manejar adecuadamente. Este enfoque fallará si sus valores alcanzan los límites del tipo, fallará, pero para casi todo el rango de valores decimales válidos debería funcionar.
Entonces el código terminado será algo así como:
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()
... debería darte los resultados que esperas.
También puede usar la biblioteca decimal para lograr esto, pero el contenedor que propongo es más simple y puede preferirse en algunos casos.
Editar: Gracias Blckknght por señalar que el 5
caso marginal ocurre solo para ciertos valores aquí .