2016-12-03 61 views
3

我不明白,爲什麼從math.h是不是就roundf()功能一輪donation變量,而這輪livestockPM沒有問題。我需要爲其他計算使用四捨五入的值,但我使用printf來檢查值是否正確,並且它只是返回錯誤的值(不包括變量donation)。另外,變量final只返回值,如果四捨五入爲.00,那麼無論什麼變量farmer1,2,3都成立。爲什麼不roundf()四捨五入浮點值,爲什麼int - float數學運算返回錯誤的值?

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 

int main(){ 
    int farmer1 = 9940; 
    int farmer2 = 4241; 
    int farmer3 = 7779; 

    float livestockPM = (float)farmer1/(float)farmer2; 
    printf("livestock: %f\n",livestockPM); 

    livestockPM = roundf(livestockPM * 100)/100; 
    printf("livestock rounded: %f\n",livestockPM); 

    float donation = (float)livestockPM * (float)farmer3; 
    printf("donation: %f\n", donation); 

    donation = roundf(donation * 100.00)/100.00; 
    printf("donation rounded: %f\n", donation); 

    float final = donation * (float)farmer2; 
    printf("final: %f\n", final); 

    return 0; 
} 

輸出:

livestock: 2.343787 
livestock rounded: 2.340000 
donation: 18202.859375 
donation rounded: 18202.859375 
final: 77198328.000000 

任何人有任何想法,爲什麼?我在想因爲float與float相乘,但我似乎無法像這樣工作。我嘗試從整型變量中刪除(float),但結果也不理想。謝謝。

+3

'float'只有6位或7位數的精度。將所有'浮動'改爲'雙',並使用'round',而不是'roundf'。 – user3386109

+1

@ user3386109謝謝,實際工作! – Holsen

回答

5

OP的float使用二進制浮點編碼和18202.859375缺乏精度承擔一個值,該值"%f"打印爲18202.860000

一個float不能代表一切可能的號碼。作爲二進制浮點數,它可以表示下面的數字。見IEEE 754 Converter,但不在中間。

18202.859375 
18202.86138125 

當以下執行時,最好的結果是18202.859375

float donation_rounded = roundf(18202.859375 * 100.00)/100.00; 

回想printf("%f\n", x)打印許多文本地四捨五入到最接近的值0.000001。

代碼可以使用double,但會帶有大量發生同樣的問題,但可能滿足OP「的燃眉之急。 @user3386109


由於OP似乎試圖應付的錢,有標準C. best money/currency representation沒有解決方案進入一些問題。