在python中如何比較兩個float
- 2020 年 1 月 6 日
- 筆記
奇怪的現象
前幾天跟同事聊起來,在電腦內部float比較是很坑爹的事情。比方說,0.1+0.2得到的結果竟然不是0.3?
>>> 0.1+0.2 0.30000000000000004
為什麼會出現如此傻的結果呢?
這篇文章做了詳細的解釋,簡單的來說就是電腦裡面的數字是由二進位保存的,在電腦內部有些數字不能準確的保存,於是就保存一個最靠近的數字。
在十進位中也會存在這樣的問題,數字不能準確地表示像1/3這樣的數字,所以你必須舍入到0.33之類的東西 – 你不要指望0.33 + 0.33 + 0.33加起來就是1。
因此我們在比較兩個float是否相等時,不能僅僅依靠 == 來進行判斷,而是當他們兩者的差小於一個我們可以容忍的小值時,就可以認為他們就是相等的。
Python中是如何解決的?
各種語言中都有類似的處理方式,python中是這樣處理的? StackOverFlow有類似的問題: what-is-the-best-way-to-compare-floats-for-almost-equality-in-python
簡單粗暴的判斷方法
return abs(f1 - f2) <= allowed_error
python3.5之後,PEP485提案中已給出了解決方案。 使用math.isclose方法,傳入需要比較的兩個數和可以接受的精度差值即可。
PEP 485: A function for testing approximate equality
PEP 485 adds the math.isclose() and cmath.isclose() functions which tell whether two values are approximately equal or 「close」 to each other. Whether or not two values are considered close is determined according to given absolute and relative tolerances. Relative tolerance is the maximum allowed difference between isclose arguments, relative to the larger absolute value:
math.isclose 使用方法
>>> import math >>> a = 5.0 >>> b = 4.99998 >>> math.isclose(a, b, rel_tol=1e-5) True >>> math.isclose(a, b, rel_tol=1e-6) False It is also possible to compare two values using absolute tolerance, which must be a non-negative value: >>> import math >>> a = 5.0 >>> b = 4.99998 >>> math.isclose(a, b, abs_tol=0.00003) True >>> math.isclose(a, b, abs_tol=0.00001) False