Python小数运算失精问题

在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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值