天天看點

float和double類型資料做比較問題

因為float和double類型的資料有資料精度,是以直接用“==”或者“!=”做比較會出現很多的問題,這類比較一般都使用宏定義一個資料精度,在精度允許誤差範圍内則認為兩個數相等。

以最常見的問題做分析:

float a 與0作比較程式:

我們經常不這樣寫代碼 

if(a == 0.0)

{

printf("a equal 0");

}

而是這樣寫

#define EPSINON 1e-6

if(fabs(a-0.0) < EPSINON)

{

printf("a equal 0");

}

下面的代碼将為我們解開疑惑:

  1 #include <stdio.h>

  2 #include <math.h>

  3 #define EPSINON 1e-6

  4 

  5 int main(int argc,char *argv[])

  6 {

  7     float a = 120.02;

  8     float b = 120;

  9     float c = 0.02;                                                                                                                                                

 10 

 11 

 12     if(a-b == c)

 13     {

 14         printf("%f - %f = %f\n",a,b,c);

 15     }   

 16     printf("a = %f,b = %f,a-b = %f\n",a,b,a-b);

 17     

 18     

 19     return 0;

 20 }   

執行結果如下:

[email protected]:~/c_language$ ./a.out

a = 120.019997,b = 120.000000,a-b = 0.019997

從以上代碼就可以看出精度在float和double比較中的重要性

繼續閱讀