2009-02-23 89 views
1

我想提取一個浮點值的整數和小數部分,而且我似乎遇到了一些奇怪的舍入問題,這可能是由於存儲的浮點數不精確。像sprintf這樣的顯示函數如何將數字轉換爲字符串?

我有一些像這樣的代碼來提取小數部分:

double number = 2.01; 
int frac = int(floor(number * 100)) % 100; 

然而在這裏,而不是1的結果出來爲0。這似乎是因爲原來的雙實際上被存儲爲:

2.0099999... 

但是運行的sprintf似乎得到這樣一個正確的轉換:

char num_string[99]; 
sprintf(num_string,"%f",number); 

sprintf如何在上述方法不正確的情況下得到正確答案?

回答

2

>然而,這裏的結果而不是1出來作爲一個。

你是什麼意思?

2.099999 ......

或者說,更像是2.00999...

正如您所指出的:

int frac = int(floor(number * 100)) % 100; 

將是:

int frac = int(floor(2.00999... * 100)) % 100; 
     = int(floor(200.999...)) % 100; 
     = int(floor(200.999...)) % 100; 
     = int(200) % 100; 
     = 200 % 100; 
     = 0; 

你可能感興趣this

而且,看到modfmath.h

double modf(double x, double *intptr) /* Breaks x into fractional and integer parts. */ 

MODF()是不是做雜耍自己一個更好的選擇。

+0

感謝您指出我的錯誤,我真的應該避免在深夜寫下這樣的問題。 – 2009-02-23 06:03:00

+0

你能解決它嗎? – dirkgently 2009-02-23 06:11:02

1

我同意dirkgently從math.h使用modf。但是,如果你必須自己做雜耍,試試這個代碼。這應該解決你看到的問題。

int round(double a) { 
    if (a > 0) 
     return int(a + 0.5); 
    else 
     return int(a - 0.5); 
} 

int main() 
{ 
    double number = 2.01; 
    int frac = round((number - ((int)number)) * 100); 
    printf("%d", frac); 
} 
相關問題