2013-01-15 64 views
1

我做了這樣的事情自動四捨五入一個

long double n; 

cin >> n; 

n = n * 10000; 

long long int temp = (long long) n; 

現在,當我嘗試打印溫度,然後在一些測試情況下,問題occours像2.36

爲2.36的價值溫度應該是23600,但臨時的價值出來是23599

請別人幫我這個已經有4代錯答爲這個..小問題

˚F或簡化.. 我的代碼是這樣

int main() 

{ 

int t; 

for(scanf("%d", &t); t-- ;) { 

    float n; 
    scanf("%f", &n); 
    n *= 10000; 
    long int as = (long int) n; 
    cout << "\nas : " << as << " n : " << n << endl; 
    long a, b; 
    a = as; 
    b = 10000; 
    while(a%b != 0) { 
     long temp = a % b; 
     a = b; 
     b = temp; 
    } 
    long factor = b; 
    cout << (10000/factor) << endl; 
} 
return 0; 

}

這一計劃的目的是什麼的..我得到了許多小數點後4位是最多可以有。那是一個擊球手得分的平均得分,所以我們必須找到他應該得到這個得分的最小比賽數量

+4

IEEE-754浮點問題:舍入錯誤。 (http://floating-point-gui.de/) –

+4

'double'不是一個確切的類型。你沒有*確切的數值'2.36'。 –

+1

並注意演員不需要。編譯器會在不被告知的情況下執行**轉換**。 –

回答

4

這是因爲內部表示浮點的方式。在執行截斷之前,您應該將關閉。

做一個floor(n+0.5)ceil(x-0.5)將正確的數字。

編輯:

由於您的截斷一步本身就是一種地板(..)操作,你應該只是做n = n * 10000 + 0.5作爲@Mooing鴨子說。

Example

+0

截斷是一個地板,所以他真正需要的是轉換前的「+ 0.5」,他很好走。 –

+0

@MooingDuck錯過了。完全正確。 –