最近在做一个问题的时候遇到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是有很大不同的。
留作记录,以作警示。