yuyuyihu 2019-07-29 17:02 采纳率: 0%
浏览 1177

python计算会出现误差,为什么,怎么避免?

#企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成, 高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

第一种:
pro = float(input("请输入当月利润(单位:万):"));
sal=0;
if pro-10>0:
sal=10*0.1;
if(pro-20>0):
sal=sal+10*0.075;
if(pro-40>0):
sal=sal+20*0.05
if(pro-60>0):
sal=sal+20*0.03
if(pro-100>0):
sal=sal+40*0.015+(pro-100)*0.01
else:
sal=sal+(pro-60)*0.015
else:
sal=sal+(pro-40)*0.03
else:
sal=sal+(pro-20)*0.05
else:
sal=sal+(pro-10)*0.075
else:
sal=pro*0.1

print("奖金数为:",sal,"万");
执行结果如下(输入79也有问题):
图片说明!

打断点执行,发现在这一步执行sal=sal+(pro-60)*0.015发生误差,为什么?

第二种:
i =pro;
arr = [100,60,40,20,10,0]
rat = [0.01,0.015,0.03,0.05,0.075,0.1]
r = 0
for idx in range(0,6):
if i>arr[idx]:
r+=(i-arr[idx])*rat[idx]
#print((i-arr[idx])*rat[idx])
i=arr[idx]
print(r);

输入68,第二种计算方法也出现误差

图片说明

这种误差是为什么,为什么会发生,怎么避免?

  • 写回答

2条回答 默认 最新

  • xSeeker~ 2019-07-29 17:50
    关注

    深层原因是在于计算机无法精确表示部分浮点数时,只能近似表示,因此存在误差,这是所有编程语言都存在的问题,可深入了解下,这种问题无法彻底解决;
    常见的应对办法是在制定的精度要求下,乘法-》截取-》除法,如 0.1 + 0.2 = 0.30000000000000004 (保留1位小数)int(0.30000000000000004 *10 ) /10,截取方法也有很多可了解下;

    评论

报告相同问题?

悬赏问题

  • ¥15 怎么获取下面的: glove_word2id.json和 glove_numpy.npy 这两个文件
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug