Python浮点型(float)运算结果不正确的解决方案


Posted in Python onSeptember 22, 2020

一、问题说明

以前对浮点数运行没有没有太在意。昨天同事要求把百分比结果保存到文件上,然后就以保存1位小数的形式给他保存了。

但是今天同事运行时问能不能统一以一位小数的形式保存,当时觉得很奇怪昨天就是以一位小数形式存的怎么还会提这种要求呢。

其给回的截图确实是部分是一位小数的,但一部分是很长的。查看代码都统一如下格式:

# 使用round保留三位小数,然后乘以100,最后格式化为带百分号的字符串
rate=f"{round(x/y,3) * 100}%"

代码上没看出什么问题,直接运行确实是有些结果是一长串的。进行调试发现当x为37y为76时即会出现问题,如下图所示:

Python浮点型(float)运算结果不正确的解决方案

进行步骤拆分,发现round方法没有问题,问题在浮点数乘以100上(同时如下图可以看到也不是所有浮点数乘都有问题)

Python浮点型(float)运算结果不正确的解决方案

二、原因探究

搞不清原因,直到看到这篇文章:https://www.programiz.com/python-programming/numbers

大意是说二进制对很多浮点数无法准确表示只能用一个近似值代替,而当使用这些以近似值代替的浮点数进行进算时本质上是这些进似值参与了运算,出来的结果也就是进似值运算后的结果。

也就是说,一是这不是乘100的问题也不是乘法的问题而是整个浮点数运算都有问题,二是这不是python的问题是计算机浮点数存储的问题像C、Java等其他计算机语言进行运算都会有问题。

Python浮点型(float)运算结果不正确的解决方案

可能有人会疑惑:为什么二进制可以表示2不能表示0.2呢?

这是因为数值和字符串是不一样的,如果是字符串那么表示2.2点的左右两边的2编码是一样的就可以了(如ASCII码:504650),但数值不是这样,数值的整数部分和小数部分需要一个统一的表示形式,那就是加权位计数法。

整数部分都要以2的0次方(20)到2的无穷次方(2∞)表示,这没有问题,只要长度足够就能表示出所有奇数和偶数。2 = 1 * 21 + 0 * 20 = 10

小数部分都要以2的-1次方(2-1)到2的负无穷次方(2-∞)表示,这就有问题,因为比如2-1...2-∞不管怎么组合都不能完全等于0.2。0.2 = 0 * 2-1 + 0 * 2-2 + 1 * 2-3 ...

三、处理办法

这情况让我想起上份工作局方领导的一句话,应该是“可以理解但不能接受”。

原理上二进制无法精确表示一些浮点数可以理解,但是就这么返回个显然错误的结果给用户那是无法接受的。

python提供了Decimal()方法让浮点运算结果可以和人平时运算的结果一样。(Decimal本质应该还是通过加长长度提高精度)

Python浮点型(float)运算结果不正确的解决方案

# Decimal传字符串才能准确表示,所以需要先用str()把round()的结果转为字符串
rate=f"{Decimal(str(round(x/y,3))) * 100}%"

# 其实上边的结果出来是48.700%的形式,即三位小数的形式并不太符合我们保留一位小数的想法,真正符合想法得下面这样
# rate=f"{round(Decimal(str(round(x/y,3))) * 100, 1)}%"

# 其实我们说了这么多,我们都是建立在决定保留多少位再乘100这个前提下,倘若我们先乘100后决定保留几位那都不需要用Decimal
# rate=f"{round(x/y*100,1)}%"

Python浮点型(float)运算结果不正确的解决方案

参考:

https://www.programiz.com/python-programming/numbers

https://docs.python.org/3.7/library/decimal.html

以上就是Python浮点型(float)运算结果不正确的解决方案的详细内容,更多关于Python浮点型(float)运算结果不正确的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
Python中的lstrip()方法使用简介
May 19 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
python实现静态服务器
Sep 05 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Python3常见函数range()用法详解
Dec 30 Python
matplotlib 范围选区(SpanSelector)的使用
Feb 24 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 #Python
python 如何区分return和yield
Sep 22 #Python
Python中三维坐标空间绘制的实现
Sep 22 #Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 #Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 #Python
Python如何获取文件路径/目录
Sep 22 #Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 #Python
You might like
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
javascript中的几个运算符
2007/06/29 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
jQuery中focus事件用法实例
2014/12/26 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
Python实现爬取逐浪小说的方法
2015/07/07 Python
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
基于Python的XSS测试工具XSStrike使用方法
2017/07/29 Python
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
为什么Python中没有"a++"这种写法
2018/11/27 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
Python random模块的使用示例
2020/10/10 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
求职信模版
2013/11/30 职场文书
合作经营协议书范本
2014/04/17 职场文书
车间核算员岗位职责
2014/07/01 职场文书
孩子教育的心得体会
2014/09/01 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
个人总结格式范文
2015/03/09 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
Java并发编程必备之Future机制
2021/06/30 Java/Android