python中浮點數比較判斷!為什么不能用==


問題:浮點數比較為什么不能用==來寫?

 

答:計算機里面的數字是由二進制保存的,在計算機內部有些數字不能准確的保存,於是就保存了一個最靠近的數字。

計算機表示浮點數(float或double類型)都有一個精度限制,對於超出了精度限制的浮點數,計算機會把它們的精度之外的小數部分截斷。

因此比較兩個float是否相等,不能僅僅依靠==來判斷,而是當他們的兩者的差值小於一個我們可以容忍的小值時,就可以認為它們相等。

 

解決辦法:

1、在python3.5之前,可以通過計算兩個浮點數之差來判斷兩個浮點數是否相等:

  例子1: abs(f1 - f2) <= allowed_error   可接受的誤差

或:

def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

 


2、python 3.5之后,PEP485提案中給出了解決方案。math模塊新增一個isclose函數用來判斷兩個浮點數的值是否接近或相等
   例子2:

  • 源碼:
 isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
  • 參數
  1. a,b:兩個需要比較的浮點數;
  2. rel_tol: 相對於輸入值的大小,被認為是“接近”的最大差異;
  3. abs_tol: 無論輸入值的大小,被認為“接近”的最大差異
  • 本質算法
 abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
 
import math
print(math.isclose(2.1,2.2,rel_tol=0.1))
# 結果:True
# 同理abs_tol也可以自定義

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM