Python浮点数误差与解决方法
目录
1.浮点数误差
2.解决方法
1.浮点数误差
浮点数一个普遍的问题就是在计算机的世界中,浮点数并不能准确地表示十进制。并且,即便是最简单的数学运算,也会带来不可控制的后果。因为,在计算机的世界中只认识0与1。
# 浮点数
print("0.1 + 0.1 = ", 0.1 + 0.1)
print("0.1 - 0.1 = ", 0.1 - 0.1)
print("0.1 * 0.1 = ", 0.1 * 0.1) #计算机无法精确存储0.01,存储了它的近似值。
print("0.1 / 0.1 = ", 0.1 / 0.1)
print("0.3 == 3 * 0.1\t", 0.3 == 3 * 0.1)a = 0.2
b = 0.1
print("a + b = ", a + b) #计算机无法精确存储0.3,存储了它的近似值。#对大多数实数,计算机都无法精确存储。这造成误差。## #在用计算机解决实际问题时,要考虑上述误差的积累。
运行程序,结果如下
0.1 + 0.1 = 0.2
0.1 - 0.1 = 0.0
0.1 * 0.1 = 0.010000000000000002
0.1 / 0.1 = 1.0
0.3 == 3 * 0.1 False
a + b = 0.30000000000000004
可以看出第3、5、6行的异常之处,就来自于计算机的cpu与浮点数的表示方式,我们自己在代码层面是没法控制的。在有些需要精确表示浮点数的场合,例如财务结算,这些误差就不可接受。
2.解决方法
python中的decimal模块可以解决上面的烦恼
decimal模块中,可以通过整数,字符串或原则构建decimal.Decimal对象。如果是浮点数,特别注意因为浮点数本身存在误差,需要先将浮点数转化为字符串
导入模块decimal
# 浮点数
from decimal import Decimal
print("0.1 + 0.1 = ", 0.1 + 0.1)
print("0.1 - 0.1 = ", 0.1 - 0.1)
print("0.1 * 0.1 = ", Decimal('0.1') * Decimal('0.1')) #计算机无法精确存储0.01,存储了它的近似值。
print("0.1 / 0.1 = ", 0.1 / 0.1)
print("0.3 == 3 * 0.1\t", 0.3 == 3 * 0.1)a = 0.2
b = 0.1
print("a + b = ", Decimal(str(a)) + Decimal(str(b))) #计算机无法精确存储0.3,存储了它的近似值。#对大多数实数,计算机都无法精确存储。这造成误差。## #在用计算机解决实际问题时,要考虑上述误差的积累。
运行结果如下
0.1 + 0.1 = 0.2
0.1 - 0.1 = 0.0
0.1 * 0.1 = 0.01
0.1 / 0.1 = 1.0
0.3 == 3 * 0.1 False
a + b = 0.3
当然精度提升的同时,肯定带来的是性能的损失。在对数据要求特别精确的场合(例如财务结算),这些性能的损失是值得的。但是如果是大规模的科学计算,就需要考虑运行效率了。毕竟原生的float比Decimal对象肯定是要快很多的。
Python浮点数误差与解决方法相关推荐
- Python线程安全问题及解决方法
Python线程安全问题及解决方法 Python多线程是通过threading模块来实现的. 参考: https://mp.csdn.net/postedit/91069618 一.多线程共享全局变量 ...
- 通过pip下载python包缓慢的解决方法
通过pip下载python包缓慢的解决方法 参考文章: (1)通过pip下载python包缓慢的解决方法 (2)https://www.cnblogs.com/ambitious-to-49/p/11 ...
- VScode Python no module的解决方法
VScode Python no module的解决方法 参考文章: (1)VScode Python no module的解决方法 (2)https://www.cnblogs.com/andy-0 ...
- python爬虫中文乱码解决方法
python爬虫中文乱码解决方法 参考文章: (1)python爬虫中文乱码解决方法 (2)https://www.cnblogs.com/surecheun/p/9694052.html 备忘一下.
- python爬虫 403 Forbidden 解决方法
python爬虫 403 Forbidden 解决方法 参考文章: (1)python爬虫 403 Forbidden 解决方法 (2)https://www.cnblogs.com/tian-sun ...
- pycharm未识别python工具库的解决方法
pycharm未识别python工具库的解决方法 本人遇到了已经安装了python工具库,但pycharm没有识别到的情况.后来发现,原来是我设置的运行环境没有选对.我的工具库安装在conda创建的新 ...
- php 浮点数比较 出错,PHP计算浮点数出错的解决方法
PHP计算浮点数出错的解决方法 发布时间:2020-06-26 14:37:49 来源:亿速云 阅读:111 作者:Leah 这篇文章将为大家详细讲解有关PHP计算浮点数出错的解决方法,文章内容质量较 ...
- mac如何导入python第三方库_Mac系统中python idle导入第三方模块成功,ecplise导入python第三方模块失败解决方法...
遇到一个比较纠结了4个月的问题,一直没有在意,今天实在忍受不了,尝试各种解决办法,终于把这个烦人的问题完美解决,不敢独享,写出来和各位大神共享. 问题:在mac OSx操作系统下,安装了python第 ...
- vscodepython技巧_VScode Python no module的解决方法
遇见VScode 今天逛知乎的时候发现了这个编译器,发现不仅支持各种语言的编写,甚至还支持markdown的编写. 分分钟搭建好环境,把原来的python项目移植了过去,准备大干一场. 刚开始都没用问 ...
最新文章
- 视觉系统的演化之旅——视觉器官、光感受器及视觉分子
- Linux下安装GCC5.3.0
- 【模型部署】风控模型部署相关知识
- Python 3 集合基础和概念!
- 关于职场和职业发展的一些心得
- php基础教程文档,PHP5基础教程
- sar图像去噪matlab,一种基于总曲率的SAR图像变分去噪方法与流程
- springcloud注册demo(使⽤第⼀代Spring Cloud核⼼组件完成项⽬构建、编码及测试)
- ArcGIS 的 http://localhost:8399/arcgis/rest/services 无法打开,显示404 的解决办法
- python writerow 返回值_python – .writerow()csv返回一个数字而不是写行
- iptables端口转发
- MATLAB数字水印处理技术的实现
- win7 flash 提示加载失败
- 【项目管理】团队绩效域管理
- 【IT职场】如何成为T型甚至A型人物。
- c++ 输入数字 输出汉语读法(拼音)代码
- 如何平衡老师任务和自学之间的关系
- 情侣生日纪念日倒数提醒的便签
- wps表格宏被禁用如何解禁_office 2007 禁止宏提示“宏已被禁用”的解决办法
- 【实用工具】Visio画时序图组件
热门文章
- 1.实验吧_ropbaby(西普杯CTF)_onegadget
- 多边形游戏 动态规划C语言实现
- python聚类分析步骤_【复习】聚类分析的方法分类
- 大一计算机实践作业牡丹花,综合实践-美丽的牡丹花教案.pdf
- Spring Boot 如何正确读取配置文件属性
- css的calc计算高度
- python的scatter函数_python scatter函数用法实例详解
- 亲身试验:python不是内部或外部命令,也不是可运行的程序或批处理文件
- 谁不知道华为云CDN加速服务,我都会心疼好久
- aria2c 编译安装 Linux,Linux安装 Aria2