对sprintf精度的限制

时间:2017-07-28 19:53:27

标签: c printf

我最近遇到过这段代码。它会产生奇怪的结果(大约在第18位后有大量的随机数字。)我试图找到有关sprintf限制的信息,但找不到它。我想弄清楚答案是否真的正确或只是垃圾。当传递0.025(作为双精度)时,它打印出来:

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);
}

1 个答案:

答案 0 :(得分:4)

答案实际上是正确的 - 不是随机数字。

double通常可以表示完全约2 64 不同的值。

0.025不是其中之一binary64 double

最接近的double是0.025000000000000001387 ....
下一个最接近的double是0.024999999999999997918 ...

sprintf()做得很好。