python中实现精确的浮点数运算详解


Posted in Python onNovember 02, 2017

为什么说浮点数缺乏精确性?

在开始本文之前,让我们先来谈谈浮点数为什么缺乏精确性的问题,其实这不是Python的问题,而是实数的无限精度跟计算机的有限内存之间的矛盾。

举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也只有有限精度,以C语言中的双精度浮点数double为例,精度为52个二进制位),要表示任意实数(无限精度)的时候我就只能通过舍入(rounding)来近似表示。

比如1.2我会表示成1,2.4表示成2,3.6表示成4.

所以呢?

在算1.2 - 1.2的时候,由于计算机表示的问题,我算的实际上是1 - 1,结果是0,碰巧蒙对了;

在算1.2 + 1.2 - 2.4的时候,由于计算机表示的问题,我算的实际上是1 + 1 - 2,结果是0,再次蒙对了;

但是在算1.2 + 1.2 + 1.2 - 3.6的时候,由于计算机表示的问题,我算的实际上是1 + 1 + 1 - 4,结果是-1,运气没那么好啦!

这里的1.2, 2.4, 3.6就相当于你问题里的0.1, 0.2和0.3,1, 2, 4则是真正在计算机内部进行运算的数值,我说清楚了吗?

其他请看IEEE 754浮点数标准,比如CSAPP第二章啥的(虽然估计你没兴趣看)。

另:不仅仅是浮点数的在计算机内部的表示有误差,运算本身也可能会有误差。比如整数2可以在计算机内准确表示,但是要算根号2就有误差了;再比如两个浮点数相除,本来两个数都是精确表示的,但除的结果精度却超出了计算机内实数的表示范围,然后就有误差了。

好了,下面话不多说了,开始本文的正文:

起步

浮点数的一个普遍的问题是它们不能精确的表示十进制数。

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>

这是由于底层 CPU 和IEEE 754 标准通过自己的浮点单位去执行算术时的特征。看似有穷的小数, 在计算机的二进制表示里却是无穷的。

一般情况下,这一点点的小误差是允许存在的。如果不能容忍这种误差(比如金融领域),那么就要考虑用一些途径来解决这个问题了。

Decimal

使用这个模块不会出现任何小误差。

>>> from decimal import Decimal
>>> a = Decimal('4.2')
>>> b = Decimal('2.1')
>>> a + b
Decimal('6.3')
>>> print(a + b)
6.3
>>> (a + b) == Decimal('6.3')
True

尽管代码看起来比较奇怪,使用字符串来表示数字,但是 Decimal 支持所有常用的数学运算。 decimal 模块允许你控制计算的每一方面,包括数字位数和四舍五入。在这样做之前,需要创建一个临时上下文环境来改变这种设定:

>>> from decimal import Decimal, localcontext
>>> a = Decimal('1.3')
>>> b = Decimal('1.7')
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...  ctx.prec = 3
...  print(a / b)
...
0.765
>>> with localcontext() as ctx:
...  ctx.prec = 50
...  print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>

由于 Decimal 的高精度数字自然也就用字符串来做展示和中转。

总结

总的来说,当涉及金融领域时,哪怕是一点小小的误差在计算过程中都是不允许的。因此 decimal 模块为解决这类问题提供了方法。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python类的用法实例浅析
May 27 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
Python3之手动创建迭代器的实例代码
May 22 Python
python pandas时序处理相关功能详解
Jul 03 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
Python模块汇总(常用第三方库)
Oct 07 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
python math模块的基本使用教程
Jan 16 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
Python自然语言处理之切分算法详解
Apr 25 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 #Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 #Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 #Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 #Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 #Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
Nov 01 #Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 #Python
You might like
关于PHP堆栈与列队的学习
2013/06/21 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
javascript常用功能汇总
2015/07/05 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现自动更换ip的方法
2015/05/05 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
python程序如何进行保存
2020/07/03 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
幼儿园实习自我鉴定
2013/12/15 职场文书
应届护士求职信范文
2014/01/26 职场文书
致接力运动员加油稿
2015/07/21 职场文书
公司仓库管理制度
2015/08/04 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
javascript对象3个属性特征
2021/11/17 Javascript