python中eval的问题
问题描述

如图,Python2.7在使用eval计算浮点数表达式的时候,
eval(’0.3-0.1==0.2’) # 输出为Falseeval(’%d - %d == %d’%(0.3, 0.1, 0.2)) # 输出为Trueeval(’%s - %s == %s’%(0.3, 0.1, 0.2)) # 输出为Falseeval(’%s - %s == %s’%(’0.3’, ’0.1’, ’0.2’)) # 输出为False
这就让人特别疑惑了,在网上没找到答案,请高手指导!
更新:
还有个问题请教下,a=0.3-0.1,print(a)输出0.19999999999999998;b=0.2,但是print(’%s==%s’%(a,b))却输出的是 0.2==0.2,这里为什么在格式化字符串的时候,a由0.19999999999999998变成了0.2呢?
问题解答
回答1:一般在计算机里不能直接用 == 比较2个浮点数是否相等。
因为浮点数值在计算机存在误差。
python有 decimal 和 fraction 2个模块用来进行高精度浮点计算。
例子
>>> from fractions import Fraction>>> Fraction(’0.3’)-Fraction(’0.1’) == Fraction(’0.2’)True>>> from decimal import Decimal>>> Decimal(’0.3’)-Decimal(’0.1’) == Decimal(’0.2’)True>>> 回答2:
这和eval没什么关系,主要是精度问题,这个在所有的编程语言都会遇到,你试试 0.3-0.1 == 0.2 都会直接返回False. 百度 JavaScript 0.2-0.1问题,然后看一下《计算机组成原理》最开始的 数据表示。
https://stackoverflow.com/que... 这个是 一个高票回答。
回答3:eval(’0.3-0.1==0.2’) # 输出为False, 是因为0.3-0.1=0.19999999999999998eval(’%d - %d == %d’%(0.3, 0.1, 0.2)) # 输出为True, 是因为你%d传入是整数,相当于0-0=0eval(’%s - %s == %s’%(0.3, 0.1, 0.2)) # 输出为False, 参考1eval(’%s - %s == %s’%(’0.3’, ’0.1’, ’0.2’)) # 输出为False, 参考1
相关文章:
1. mysql sum去除重复2. javascript - swiper.js嵌套了swiper 初始设置不能向下一个滑动 结束后重新初始3. python - Django ManyToManyField 字段数据在 admin后台 显示不正确,这是怎么回事?4. 为什么span的color非要内联样式才起作用?5. docker - 如何修改运行中容器的配置6. python - pysciter 如何配置运行环境?7. python - 如何修改twisted自带的日志输出格式?8. 请问一下各位老鸟 我一直在学习独孤九贱 现在是在tp5 今天发现 这个系列视频没有实战9. 求救一下,用新版的phpstudy,数据库过段时间会消失是什么情况?10. 在cmd下进入mysql数据库,可以输入中文,但是查看表信息,不显示中文,是怎么回事,怎新手,请老师

网公网安备