2013-07-04 78 views
3

在C中,如果我們執行以下代碼:浮點值的比較失敗

float a = 0.7; 
if (a < 0.7) 
{ 
    printf("Less"); 
} 
else 
{ 
    printf("no"); 
} 

上述代碼打印「少」的代碼。

但是,如果我們執行以下代碼:

float a = 1.7; 
if (a < 1.7) 
{ 
    printf("Less"); 
} 
else 
{ 
    printf("no"); 
} 

它打印出 「無」。

這是什麼原因? float數據類型是如何工作的?

+1

你可能想查找「浮點舍入錯誤」 - 有關這些問題的巨大文章:-) –

+2

必須閱讀 - http:// docs。 oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+1

[正如你在這裏可以看到的](https://ideone.com/e8N7pn),它也可以用C++ 11打印。至於爲什麼,請參閱Luchian的鏈接。 – Borgleader

回答

11

問題是afloat,但0.7double。分配到a的值從double轉換爲float,這會失去精度。當您將a返回到double時,a被擴大爲double,但精度已經丟失,並且它們可能不再相同。

如果更改0.71.70.7f1.7f那麼他們將被轉換爲float文字和可靠地將在這兩種情況下比較等於a

1

float數據類型使用近似值。 C/C++中的每個數字數據類型都使用有限的固定數量的字節來存儲值。 float以指數格式存儲值,如果您以另一種格式將值傳遞給它,則該值將被舍入...然後,如果您查看足夠數字通過小數點分隔符,您肯定會看到非零值,零值。正如彼得亞歷山大在答覆中所說的1.7不是一個「純粹的」浮動價值。

對這樣的設計背後動機的進一步詳細的解釋可能對於這裏的人來說太長了 - 但如果你是谷歌的話,你可以閱讀更多。其中一位評論者Luchian在那裏留下了一個很好的鏈接:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html