2011-07-05 125 views
2

我試圖做一個非常簡單的程序,將首先讀取一個整數N,之後它將讀取N個數據,這是浮動,並將它們放回屏幕後2位數小數點。這很簡單,對吧?但它出錯了!這裏的源代碼:錯誤讀取浮點值

#include<cstdio> 

int main() 
{ 
    float d; 
    int n; 
    scanf("%d",&n); 
    while(n>0) 
    { 
    n--; 
    scanf("%f",&d); 
    printf("%.2f\n",d); 
    } 
    return 0; 
} 

當我把小值,如3.1或1.0,它的工作得很好。但是當我給出諸如-765057.71或978715.10這樣的大值時,它會輸出不同的值。從-765057.71打印-765057.69,下一個打印978715.13。爲什麼會發生這種情況,以及我如何解決這個問題?

回答

3

原始浮點類型沒有無限精度。正如你所看到的,有些值不能完全表示。您可以通過使用double而不是float來緩解此問題,但對於足夠大的值,您仍然會看到相同的問題。其他更強大的解決方案包括使用預先構建的任意精度庫,滾動您自己的這樣的庫(如果您需要一些時間來殺死),使用兩個整數表示您的浮點值,一個用於十進制和一個用於後面的部分,或者(如果您想要執行的操作是將回顯的數字回送到給定的小數位),而不是使用字符串。

您可能會發現這是一個有趣的閱讀:http://en.wikipedia.org/wiki/IEEE754

2

因爲單精度浮點數不能將-765057.71存儲到精度的許多位數。它可以存儲最重要的數字,但它在某個點上必須或多或少「圓」。

單精度浮點數(float)可以得到7位精度的十進制數字。如果您需要更多,則需要使用雙精度浮點數(double)。

1

浮點數只是一個近似表示。我建議你閱讀文章here