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. javascript - vscode alt+shift+f 格式化js代碼,通不過eslint的代碼風格檢查怎么辦。。。2. javascript - [js]為什么畫布里不出現圖片呢?在線等3. python - 如何判斷爬蟲已經成功登陸?4. html - vue項目中用到了elementUI問題5. html5 - 有可以一次性把所有 css外部樣式轉為html標簽內style=" "的方法嗎?6. javascript - 如何將一個div始終固定在某個位置;無論屏幕和分辨率怎么變化;div位置始終不變7. javascript - 原生canvas中如何獲取到觸摸事件的canvas內坐標?8. javascript - 有什么比較好的網頁版shell前端組件?9. javascript - 這不是對象字面量函數嗎?為什么要new初始化?10. javascript - 求解答:實例對象調用constructor,此時constructor內的this的指向?
