2016-12-13 39 views
0

我試圖做codechef問題 - https://www.codechef.com/problems/FLOW009爲什麼浮動在c不工作的方式應該?

在這裏,我的代碼(成功提交)是這樣的 -

int main(void) { 

    int testCases; 

    scanf ("%d\n", &testCases); 
    while (testCases--) { 

     float q,p; 
     scanf ("%f%f", &q,&p); 

     if (q >= 1000){ 

      printf("%.6f\n",q*p - (q*p*0.1)); 
     } 
     else{ 
      printf("%.6f\n", q*p); 
     } 

    } 

    return 0; 
} 

這已成功提交...但但是當我嘗試這種代碼 -

int main(void) { 

    int testCases; 

    scanf ("%d\n", &testCases); 
    while (testCases--) { 

     float q,p; 
     scanf ("%f%f", &q,&p); 

     if (q >= 1000){ 
      float a = q*p - (q*p*0.1); 
      printf("%.6f\n",a); 
     } 
     else{ 
      printf("%.6f\n", q*p); 
     } 

    } 

    return 0; 
} 

它說錯了答案。在我的編譯器中,所有測試用例的結果都是一樣的。發生什麼事。第一個代碼 - 我只是打印值。 在第二個 - 我正在使用一個變量來存儲值。

聚苯乙烯 - 我試圖typecasting的價值也沒有結果。

+0

簡短的回答是,「0.1」不能完全用二進制浮點表示。可能這兩段代碼與內部保持更高精度的代碼不同。 (類似於十進制,「3 x 1/3」可能會給你一個,但是如果你將1/3存儲在一個變量中,它可能四捨五入爲「0.3333333」,乘以3時不等於1.) –

+2

codechef問題描述還要求所有輸入都是整數,這表明計算也應該使用整數。 – Peter

+0

注意:'0.1'是'double'類型的。 – pmg

回答

1

將數值從double轉換爲float並且返回並不能保證獲得相同的結果。

printf("%.6f\n", q*p - (q*p*0.1)); 

的值全部轉換爲類型double和計算在double完成。 double的結果直接發送到printf

float變量的其他情況下,這些值將轉換爲double,計算完成爲double,然後轉換爲float以進行賦值。在傳遞到printf之前,該值會轉換爲雙倍值。

總是使用double作爲浮點變量。

+0

非常感謝...這解釋了很多很多:) :) –

相關問題