2017-07-28 65 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()做就好了。