博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python float精度计算
阅读量:6878 次
发布时间:2019-06-26

本文共 1509 字,大约阅读时间需要 5 分钟。

hot3.png

浮点数误差

浮点数一个普遍的问题就是在计算机的世界中,浮点数并不能准确地表示十进制。并且,即便是最简单的数学运算,也会带来不可控制的后果。因为,在计算机的世界中只认识0与1。

>>> x = 4.20>>> y = 2.10>>> x + y6.3000000000000001>>> (x+y) == 6.3False>>> x = 1.2>>> y = 2.3>>> x + y3.5>>> (x + y) == 3.5True
  •  

上述种种问题,就来自于计算机的cpu与浮点数的表示方式,我们自己在代码层面是没法控制的。在有些需要精确表示浮点数的场合,例如财务结算,这些误差就不可接受。

decimal模块进行十进制数学计算

中的decimal模块可以解决上面的烦恼 

decimal模块中,可以通过整数,字符串或原则构建decimal.Decimal对象。如果是浮点数,特别注意因为浮点数本身存在误差,需要先将浮点数转化为字符串。

>>> from decimal import Decimal>>> from decimal import getcontext>>> Decimal('4.20') + Decimal('2.10')Decimal('6.30')>>> from decimal import Decimal>>> from decimal import getcontext>>> x = 4.20>>> y = 2.10>>> z = Decimal(str(x)) + Decimal(str(y))>>> zDecimal('6.3')>>> getcontext().prec = 4 #设置精度>>> Decimal('1.00') /Decimal('3.0')Decimal('0.3333')
  •  

当然精度提升的同时,肯定带来的是性能的损失。在对数据要求特别精确的场合(例如财务结算),这些性能的损失是值得的。但是如果是大规模的科学计算,就需要考虑运行效率了。毕竟原生的float比Decimal对象肯定是要快很多的。

flaot精确计算

# !/usr/bin/python# -*- coding: utf-8 -*-from decimal import Decimalfrom decimal import getcontextdef floatAdd(num1, num2, precision=2):    """高精度相加"""    getcontext().prec = precision  # 设置精度    return float(Decimal(str(num1)) + Decimal(str(num2)))print floatAdd(1.111, 5.4, 4)

输出:

6.511

备注:字典参数

new_item = {'val': 1.4}print new_item['val']print new_item

输出:

1.4{'val': 1.4000000000000001}

直接解决方法

new_item["val"] = round(new_item["val"], 1)

参考:

https://stackoverflow.com/questions/7878341/python-dictionary-floats

http://blog.csdn.net/bitcarmanlee/article/details/51179572

 

转载于:https://my.oschina.net/yves175/blog/1492627

你可能感兴趣的文章
CentOS学习日记:PostgreSQL篇
查看>>
Psutil监控系统进程
查看>>
探秘Java虚拟机——内存管理与垃圾回收
查看>>
mysql 主从复制延迟监控
查看>>
编译参数
查看>>
我的友情链接
查看>>
mysql 赋给用户远程权限
查看>>
使用Python创建一个简易的Web Server
查看>>
centos6.6_x64升级firefox
查看>>
实用小命令
查看>>
svn安装及Windows环境SVN迁移到Linux
查看>>
spring整合mongodb
查看>>
oracle行列转换
查看>>
配置nginx 获取客户端真实IP
查看>>
基于JSP的网上订餐系统-java网上订餐系统源代码系统演示
查看>>
阿里云云服务器硬盘分区及挂载
查看>>
信息安全与人工智能
查看>>
我的MongoDB-基础笔记
查看>>
<自考学习记录> 课程代码06370《编译技术》<2>
查看>>
Linux下Apache重启遇到No space left on device错误的解决方法
查看>>