python中eval的問題
問題描述
如圖,Python2.7在使用eval計(jì)算浮點(diǎn)數(shù)表達(dá)式的時(shí)候,
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
這就讓人特別疑惑了,在網(wǎng)上沒找到答案,請高手指導(dǎo)!
更新:
還有個(gè)問題請教下,a=0.3-0.1,print(a)輸出0.19999999999999998;b=0.2,但是print(’%s==%s’%(a,b))卻輸出的是 0.2==0.2,這里為什么在格式化字符串的時(shí)候,a由0.19999999999999998變成了0.2呢?
問題解答
回答1:一般在計(jì)算機(jī)里不能直接用 == 比較2個(gè)浮點(diǎn)數(shù)是否相等。
因?yàn)楦↑c(diǎn)數(shù)值在計(jì)算機(jī)存在誤差。
python有 decimal 和 fraction 2個(gè)模塊用來進(jìn)行高精度浮點(diǎn)計(jì)算。
例子
>>> 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沒什么關(guān)系,主要是精度問題,這個(gè)在所有的編程語言都會遇到,你試試 0.3-0.1 == 0.2 都會直接返回False. 百度 JavaScript 0.2-0.1問題,然后看一下《計(jì)算機(jī)組成原理》最開始的 數(shù)據(jù)表示。
https://stackoverflow.com/que... 這個(gè)是 一個(gè)高票回答。
回答3:eval(’0.3-0.1==0.2’) # 輸出為False, 是因?yàn)?.3-0.1=0.19999999999999998eval(’%d - %d == %d’%(0.3, 0.1, 0.2)) # 輸出為True, 是因?yàn)槟?d傳入是整數(shù),相當(dāng)于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
相關(guān)文章:
1. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.2. 為什么我ping不通我的docker容器呢???3. android - webview 自定義加載進(jìn)度條4. mysql - 怎么讓 SELECT 1+null 等于 15. javascript - 微信音樂分享6. 網(wǎng)頁爬蟲 - 用Python3的requests庫模擬登陸B(tài)ilibili總是提示驗(yàn)證碼錯(cuò)誤怎么辦?7. javascript - 微信小程序封裝定位問題(封裝異步并可能多次請求)8. 并發(fā)模型 - python將進(jìn)程池放在裝飾器里為什么不生效也沒報(bào)錯(cuò)9. linux - openSUSE 上,如何使用 QQ?10. python 怎樣用pickle保存類的實(shí)例?
