Вы хотите округлить свой ответ.
round(value,significantDigit)
Это обычное решение для этого, однако иногда это не работает так, как можно было бы ожидать с математической точки зрения, когда цифра, непосредственно уступающая (слева от) цифре, к которой вы округляете, имеет5
.
Вот несколько примеров такого непредсказуемого поведения:
>>> 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
Предполагая, что вы намереваетесь сделать традиционное округление для статистики в науке, это удобная оболочка, чтобы заставить round
функцию работать так, как ожидалось, и требует import
дополнительных вещей, таких как Decimal
.
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
Ага! На основании этого мы можем сделать функцию ...
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
По сути, это добавляет действительно маленькое значение к строке, чтобы заставить ее правильно округляться в непредсказуемых случаях, когда она обычно не работает с round
функцией, когда вы этого ожидаете. Удобное значение для добавления - это 1e-X
гдеX
длина номер строки , которую вы пытаетесь использовать round
на плюс1
.
Подход использования 10**(-len(val)-1)
был преднамеренным, так как это наибольшее небольшое число, которое вы можете добавить, чтобы форсировать сдвиг, и при этом гарантировать, что добавляемое вами значение никогда не изменит округления, даже если десятичная дробь .
отсутствует. Я мог бы использовать только 10**(-len(val))
с условным if (val>1)
вычитать1
больше ... но проще всегда всегда вычитать, 1
поскольку это не сильно изменит применимый диапазон десятичных чисел, который этот обходной путь может правильно обработать. Этот подход потерпит неудачу, если ваши значения достигнут пределов типа, это не удастся, но почти для всего диапазона допустимых десятичных значений это должно работать.
Таким образом, готовый код будет выглядеть примерно так:
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()
... должен дать вам ожидаемые результаты.
Вы также можете использовать десятичную библиотеку для достижения этой цели, но предложенная мной оболочка проще и может быть предпочтительнее в некоторых случаях.
Изменить: Спасибо Blckknght за указание, что 5
крайний случай происходит только для определенных значений здесь .