我最近遇到过这段代码。它会产生奇怪的结果(大约在第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);
}
答案 0 :(得分:4)
答案实际上是正确的 - 不是随机数字。
double
通常可以表示完全约2 64 不同的值。
0.025不是其中之一binary64 double
。
最接近的double
是0.025000000000000001387 ....
下一个最接近的double
是0.024999999999999997918 ...
sprintf()
做得很好。