你想要对答案进行四舍五入处理。
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
函数按预期工作,而无需像
Decimal
一样
import
额外的内容。
>>> 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()
......应该能够给出您期望的结果。
您还可以使用decimal库来完成此操作,但是我建议的包装器更简单,某些情况下可能更可取。
编辑:感谢Blckknght指出5
的边缘情况仅发生在某些值这里。