Python3里面的浮点计算问题

最近在做一个问题的时候遇到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是有很大不同的。

留作记录,以作警示。

时间: 2024-10-04 09:07:24

Python3里面的浮点计算问题的相关文章

Python3学习之异常处理详解

本文和大家分享的主要是python3中的异常及相关解决方法,一起来看看吧,希望对大家学习python3有所帮助. 一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 . 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: invalid syntax #语法错误示范def test: pass #语法错误示范class Foo pass #语法错误示范 print(haha 其他语法错误 . 逻辑错误 #用户

【Python3之异常处理】

一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: invalid syntax #语法错误示范 def test: pass #语法错误示范 class Foo pass #语法错误示范 print(haha 其他语法错误 逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") in

python3之异常处理(转)

一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: invalid syntax  其他语法错误 逻辑错误 #用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") int(num) 输出 >>: fsf Traceback (most recent call last): File

ubuntu下卸载python2和升级python3.5

卸载python只需一条语句就可以实现 sudu apt-get remove python ubuntu下安装python3 sudo apt-get install python3 但这样只安装了python3.4 要想使用python3.5,则必须升级python3.4 sudo add-apt-repository ppa:fkrull/deadsnakes sudo apt-get update sudo apt-get install python3.5 使用以上三行命令便可升级py

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,

Python3 - MySQL适配器 PyMySQL

本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库. PyMySQL 安装 在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装. PyMySQL 下载地址:https

Python3 数字(Number)

1.Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 2.Python 支持三种不同的数值类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型. 浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102

python2和python3中的编码问题

开始拾起python,准备使用python3, 造轮子的过程中遇到了编码的问题,又看了一下python3和python2相比变化的部分. 首先说个概念: unicode:在本文中表示用4byte表示的unicode编码,也是python内部使用的字符串编码方式. utf-8:在本文中指最少1byte表示的unicode编码方式 我在使用 if isinstance(key,unicode): key= key.encode('utf-8') 的时候,发现key值被转成了b'foo',b'bar'

CentOS 7.0 安装 python3.X 脚本

1 #!/bin/sh 2 3 #第一个Linux下的脚本,太多不明白的地方,只是依着网上的例子照葫芦画瓢,能正常运行即可 4 #运行环境 CentOS 7.0 版本 5 6 #首行指定程序的路径,以#号开头的行是注释行 7 8 #任意文本编辑器编辑此文档.默认是gedit 9 #保存在 Document 文件下,假设此文件名为test.sh 10 #右击属性使其可以执行,或者 右击菜单终端 chmod +x test.sh 11 #因为下面的命令创建文件夹需要的权限较高,先执行命令 su -