在python中进行小数运算时,是有误差的,如下面:
print(33.8-32) #>>1.7999999999999972
print(35.7-32) #>>3.700000000000003
print((33.8-32)/1.8) #>>0.9999999999999984
print((35.7-32)/3.7) #>>1.0000000000000007
得到的并不是我们想要的答案,虽然很接近。(计算有误差的根本原因是:在计算机内部,所有数都用二进制表示。一个位数有限的十进制小数,如0.7,表示成二进制形式,很可能就变成无限循环小数,而计算机显然无法存放无限循环小数,那么只能四舍五入,导致误差)
在大部分时候题目会要求保留几位小数,这时候四舍五入和原来的答案一般都是一样的,所以一般情况不需要考虑。但是当遇到了题目要求:答案为小数时保留两位小数,而为整数时不保留小数,那么就容易出错。
我们可以用这种处理办法来避免这种错误:如果一个小数与跟它最接近的整数n的差的绝对值非常小,我们就可以认为,这个小数其实就等于整数n。我们只需要将这个数进行四舍五入到整数后与它本身相减,如果他们的绝对值小于一个很小的数,我们可以忽略这种误差时,就把他当作整数。(这个很小的数eps一般取10的6次方即可)
如下面的例题:摄氏华氏温度转换
描述:输入摄氏温度,就将其转换为华氏温度输出;输入华氏温度,就将其转换成摄氏温度数输出。两者的转换关系是:
摄氏温度 = (华氏温度 - 32 ) ÷ 1.8
输入:摄氏温度或华氏温度。摄氏温度的格式是一个整数或小数后面加'C'或'c',华氏温度的格式是一个整数或小数后面加'F'或'f'。
输出:转换后的温度。摄氏温度就在数值后面加'C',华氏温度就在数值后面加'F'。如果数值是整数,就应该输出整数形式,如果数值是小数,则保留小数点后面2位。
样例输入:
样例1 33.8F 样例2 43C 样例3 12.8c
样例输出
样例1 1C 样例2 109.40F 样例3 55.04F
eps = 10e-6
s = input()
if s[-1] in ['f', 'F']:
t = (float(s[0:-1]) - 32) / 1.8
if abs(round(t) - t) < eps:
print("%dC" % round(t))
else:
print("%.2fC" % t)
elif s[-1] in "Cc":
t = float(s[0:-1]) * 1.8 + 32
if abs(round(t) - t) < eps:
print("%dF" % round(t))
else:
print("%.2fF" % t)