码迷,mamicode.com
首页 > 编程语言 > 详细

Python3里面的浮点计算问题

时间:2015-05-25 18:55:03      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:


      最近在做一个问题的时候遇到Python计算浮点数出错的问题,有兴趣的可以参考这篇文章

      http://blog.csdn.net/zhangzhengyi03539/article/details/45937063

      先来看一下这个代码

start=500000000001
end=1000000000000
i=1
total_i=(start+end)*(end-start+1)/2*i
print(total_i)

      这些代码在Python2.7中运行是不会报错的可以计算出正确结果

      375000000000250000000000


      但是在Python3中运行结果却是

      3.7500000000025e+23

      强制类型转化一下打印输出为

      375000000000249974226944


      可以看到结果竟然不一样,毫无疑问,他在计算total_i的时候出错了。接下来分步看一下错误出在哪儿了      

a=start+end
print(a)
      输出1500000000001

      

b=end-start+1
print(b)

      输出500000000000

total_i=a*b/2
print(total_i)
      输出3.7500000000025e+23

<span style="font-size:18px;">int(total_i)</span>
      输出375000000000249974226944


      可以看到int以后报错了,由科学技术法转长整型的时候出错了。


      回想一下在Python2.7中,执行

total_i=(start+end)*(end-start+1)/2*i
      的时候由于四则运算关系从左往右运算,不会出现浮点型(因为除以2的时候肯定是偶数),全程都是整数运算,因此准确度得到保证,但是在Python3中由于出现浮点运算,自动将数据存贮格式改为科学计数法了。但是从科学技术法向int转换的时候Python内部原因导致出错了。


      可以试一下,在python2中运行这一行

<span style="font-size:18px;">int(</span><span style="font-size:18px;">3.7500000000025e+23)</span>

      得到的结果跟python3是相同的。发现问题后,只要稍微修改一下代码,便可使http://blog.csdn.net/zhangzhengyi03539/article/details/45937063中的代码在3下运行了。


      连接中的程序,实际上还有很多问题,只是庆幸在计算中没有遇到,比如说

2.999999999999999999或者3.00000000000000001,这些Python都会四舍五入进行修正为3,但是在我的算法里面这个跟3是有很大不同的。


      留作记录,以作警示。


Python3里面的浮点计算问题

标签:

原文地址:http://blog.csdn.net/zhangzhengyi03539/article/details/45970849

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!