如何正確地比較兩個double型別的資料

2021-08-09 15:51:18 字數 837 閱讀 7456

今天寫**發現乙個很有意思的問題。

**如下:

double sum = 0;

for(i = 11213; i < 11325; i++)

printf("sum = %f\n", sum);

double sum2 = 66.144421;

if(sum == sum2) else

double a = 66.144421, b = 66.144421;

if (a == b)

exit(0);

執行結果如下:

sum列印出來的值和sum2相等,但是與sum2進行比較的時候得到的結果卻是不等的。這種現象應該跟double型別表示的精度有關。

所以當我們比較兩個double值是否相等時,應該採用相減的方式。即:

double sum = 0;

for(i = 11213; i < 11325; i++)

printf("sum = %f\n", sum);

double sum2 = 66.144421;

if(sum - sum2 < 1e-6) else

double a = 66.144421, b = 66.144421;

if (a == b)

exit(0);

在寫**的時候要特別注意這一點,如果程式因為這種原因發生問題,排查起來很困難。

如何正確地寫出單例模式

發表於 2014 08 28 分類於 程式設計 閱讀次數 50513 單例模式算是設計模式中最容易理解,也是最容易手寫 的模式了吧。但是其中的坑卻不少,所以也常作為面試題來考。本文主要對幾種單例寫法的整理,並分析其優缺點。很多都是一些老生常談的問題,但如果你不知道如何建立乙個執行緒安全的單例,不知道...

如何正確地部署防火牆?

防火牆在實際的部署應用過程當中,經常部署在閘道器的位置,也就是經常部署在網內和網外的乙個 中間分隔點 上,而就是在這樣乙個部署的環境中,也還存在著多種方式,且存在著許多 陷阱 本文將對幾種方式進行分析。請閱讀全文 防火牆在實際的部署應用過程當中,經常部署在閘道器的位置,也就是經常部署在網內和網外的乙...

如何正確地在MDK中使用關鍵

筆者在做移植時,將embest ide環境下的例程移到realview mdk的過程中,曾經遇到這樣乙個問題 在生成工程時,編譯全部通過,但在鏈結時提示許多符號未定義!如果讀者也遇到過這個問題,請繼續看下去,如果鏈結時提示未定義的變數是一些內聯函式 即使用了關鍵字 inline 那麼就是筆者遇到的問...