답을 반올림하고 싶습니다.
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
이 해결 방법으로 올바르게 처리 할 수있는 적용 가능한 10 진수 범위를 많이 변경하지 않으므로 항상 빼기하는 것이 더 간단합니다 . 이 방법은 값이 유형의 한계에 도달하면 실패하지만 실패하지만 거의 모든 유효 10 진수 값 범위에서 작동합니다.
완성 된 코드는 다음과 같습니다.
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
프린지 경우 특정 값을 발생 여기 .