2017-07-28 100 views
-4

我最近遇到這個代碼。它會產生奇怪的結果(大約在第18位後大量的隨機數字)。我試圖找到sprintf的限制信息,但找不到它。我試圖弄清楚答案是否正確或只是垃圾。當傳遞0.025(double類型),它打印出:Sprintf精度限制

0.025000000000000001387778780781445675529539585113525390625

#define MAX_NUM_STR_LEN 128 
void File_WriteNumber(File *fp, double value) { 
    char numbuf[MAX_NUM_STR_LEN]; 
    int sz = sprintf(numbuf, "%.100g", value); 
    fwrite (numbuf , sizeof(char), sz, fp); 
} 
+2

https://stackoverflow.com/questions/588004/is-floating-point-math-broken – yano

+0

你是通過'0.25'還是'0.025'? –

+0

@MichaelAlbers oops。糾正。 – Jiminion

回答

4

答案確實是正確的 - 而不是隨機數字。


double通常可以代表正好約2 不同的值。

0.025不是其中之一,有binary64double

最近double是0.025000000000000001387 ....
下一個最接近double是0.024999999999999997918 ...

sprintf()做就好了。