Ви хочете округлити свою відповідь.
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()
... повинен дати вам очікувані результати.
Ви можете також використовувати десяткову бібліотеку для досягнення цієї мети , але обгортка я пропоную простіше і може бути кращим в деяких випадках.
Edit: Дякую Blckknght за вказівку на те , що 5
справа бахроми відбувається тільки за певних значеннях тут .