Você quer arredondar sua resposta.
round(value,significantDigit)
é a solução comum para fazer isso, no entanto, às vezes, isso não funciona como seria de esperar de uma perspectiva matemática quando o dígito imediatamente inferior (à esquerda) ao dígito para o qual você está arredondando possui a 5
.
Aqui estão alguns exemplos desse comportamento imprevisível:
>>> 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
Supondo que sua intenção seja fazer o arredondamento tradicional para estatísticas nas ciências, este é um invólucro útil para que a round
função funcione conforme o esperado, necessitando de import
coisas extras Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Aha! Então, com base nisso, podemos fazer uma função ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
Basicamente, isso adiciona um valor muito pequeno à string para forçá-la a arredondar corretamente nas instâncias imprevisíveis em que ela normalmente não round
funciona com a função quando você espera. Um valor conveniente a acrescentar é 1e-X
onde X
está o comprimento da sequência numérica que você está tentando usar round
no plus 1
.
A abordagem do uso 10**(-len(val)-1)
foi deliberada, pois é o maior número pequeno que você pode adicionar para forçar a mudança, além de garantir que o valor adicionado nunca mude o arredondamento, mesmo que o decimal .
esteja ausente. Eu poderia usar apenas 10**(-len(val))
um condicional if (val>1)
para subtrair 1
mais ... mas é mais simples sempre subtrair o valor, 1
pois isso não mudará muito o intervalo aplicável de números decimais que esta solução alternativa pode manipular adequadamente. Essa abordagem falhará se seus valores atingirem os limites do tipo, isso falhará, mas, para quase todo o intervalo de valores decimais válidos, deve funcionar.
Portanto, o código final será algo 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()
... deve fornecer os resultados esperados.
Você também pode usar a biblioteca decimal para fazer isso, mas o invólucro que proponho é mais simples e pode ser preferido em alguns casos.
Edit: Obrigado Blckknght por apontar que a 5
caixa de franja ocorre apenas para determinados valores aqui .