问题

你需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。

Python的float类型是存在误差的

>>> a = 1.1
>>> b = 2.2
>>> a + b == 3.3
False
>>> a + b
3.3000000000000003
复制代码

解决方案

使用decimal模块,但要注意参数需要是字符串

然后其他操作(加法、比较等等)和内置的float类型一样即可

>>> from decimal import Decimal
>>> a = Decimal('1.1')
>>> b = Decimal('2.2')
>>> a + b == Decimal('3.3')
True
>>> a + b
Decimal('3.3')
复制代码

讨论

如果我们的计算对误差要求极高,例如涉及到金融领域的代码,那么可以使用decimal模块

decimal模块非常强大,上面的用法只是冰山一角

例如我们还可以使用decimal来设置保留小数点后几位

要想设置小数点精度,需要先了解decimal模块的上下文,decimal模块维护了一个上下文对象,存储着关于精度、信号处理等等操作,可以通过getcontext得到这个上下文对象

>>> import decimal
>>> decimal.getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
复制代码

其中prec就是小数点精度,我们可以直接对它进行修改看下效果

>>> import decimal
>>> a = decimal.Decimal('1')
>>> b = decimal.Decimal('3')
>>> a / b
Decimal('0.3333333333333333333333333333')
>>> decimal.getcontext().prec = 3
>>> a / b
Decimal('0.333')
复制代码

这个时候有一个问题是,以后的小数点精度都是3了,会影响到其他不想保存3位精度的计算。

实际上decimal模块还提供了一个localcontext函数,我们用with把它包裹起来,就创建了一个临时的上下文环境

import decimal
decimal.getcontext()
a = decimal.Decimal('1')
b = decimal.Decimal('3')
print(a / b)
with decimal.localcontext() as ctx:ctx.prec = 3print(a / b)
print(a / b)
复制代码

这里在with前的小数点精度为默认的28,with块里的临时精度为3,with块后精度又回到外面的28,所以输出为

Decimal('0.3333333333333333333333333333')
Decimal('0.333')
Decimal('0.3333333333333333333333333333')
复制代码

来源

Python Cookbook

关注

欢迎关注我的微信公众号:python每日一练

Python每日一练0018相关推荐

  1. Python每日一练0023

    问题 如何判断一个文件是否存在 解决方案 这个问题可以分成几类问题 如果这里的文件指的是文件或目录,我们可以用os.path.exists()方法 >>> import os > ...

  2. Python每日一练0004

    问题 如何保存迭代对象的最后N个元素 例如保存列表['a', 'b', 'c', 'd']的最后2个元素 或者保存某个迭代器对象的最后5个元素 解决方案 对于列表.元组这样的数据结构,可以使用切片来很 ...

  3. python 编程一日一练-python每日一练

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 过滤掉列表中的负数 筛选出字典{lilei: 79,jim: 88,lu ...

  4. python 编程一日一练-Python每日一练0022

    问题 你想在一个文件里每次读入固定大小的字节,比如每次读入4个字节并转成int,或者每次读入x个字节并进行结构化,例如: l = [5, 2, 4, 1, 2, 4, 5, 6, 8] with op ...

  5. python 编程一日一练-Python每日一练0013

    问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在. 解决方案 使用collections库的ChainMap类,可以快速的将多个d ...

  6. python每日一练名片管理程序_Python每日一练0022

    问题 你想在一个文件里每次读入固定大小的字节,比如每次读入4个字节并转成int,或者每次读入x个字节并进行结构化,例如: l = [5, 2, 4, 1, 2, 4, 5, 6, 8] with op ...

  7. Python每日一练第5天——将一组数尽可能均匀地分成两堆,使两个堆中的数的和尽可能相等

    每日一练-做题 麦克叔叔去世了,他在遗嘱中给他的两个孙子阿贝和鲍勃留下了一堆珍贵的口袋妖怪卡片.遗嘱中唯一的方向是"尽可能均匀地分配纸牌的价值".作为Mike遗嘱的执行人,你已经为 ...

  8. Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词

    #coding:utf-8 import os,repath = 'test' files = os.listdir(path)def count_word(words):dic = {}max = ...

  9. python 编程一日一练-2018-12-01:python每日一练(1)

    (https://docs.python.org/3/library/functions.html#print "Permalink to this definition") 题目 ...

最新文章

  1. 训练网络loss出现Nan的原因总结记录
  2. 来吧!我教你画真正的流程图
  3. 一个电脑多个github、gitlab、oschina账户
  4. 尚学堂java培训_IT培训教育平台课程分享
  5. 240多个jQuery插件 (转)
  6. python与冒泡排序
  7. IPMI从驱动到应用(下篇 )
  8. 非受检异常(运行时异常)和受检异常的区别等
  9. bp神经网络matlab代码_基于Matlab的BP神经网络识别26个英文字母
  10. Python数据结构实战——哈希表(HashTable)
  11. 如何找到靠谱的微信小程序,公众号H5开发外包,定制开发公司?
  12. html可编辑下拉选项卡,bootstrap可编辑下拉框jquery.editable-select
  13. 拓端tecdat|R语言用多重插补法估算相对风险
  14. c4d渲染测试软件,提升C4D渲染速度,你需要的高端显卡选购指南
  15. LD3320 语音识别模块 开发板集成STC单片机_笔记1
  16. WordPress主题 LightSNS v1.6.60 强大的社交系统SNS主题(免受权)
  17. Pandas-数据结构-DataFrame(二):DF的属性【形状/shape、行索引/index、列索引/columns、查看值/values、转置/T、head.()、tail.()】
  18. 个人网站音乐服务器,自己的私人音乐流媒体服务,这才是多少音乐者的梦寐以求的...
  19. Vmware workstation 16pro解锁装MacOS
  20. Atomic的介绍和使用(原子变量)

热门文章

  1. MySQL笔记10:engine=innodb和engine=myisam的区别和用法!
  2. Linux开关机命令:shutdown,reboot,halt,init之间的区别
  3. ObjC load与initialize 简析
  4. 用TortoiseSVN忽略文件或文件夹(ignore)(网络摘抄记录)
  5. Android Crash战斗日记(一、原理篇)
  6. 阿里七层流量入口 Tengine硬件加速探索之路
  7. [设计模式]原型模式
  8. linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
  9. nginx+awstats多域名日志分析2
  10. JavaWeb: 报错信息The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path...