This question already has answers here:
Is floating point math broken?
(31个答案)
2年前关闭。
我最近遇到了这段代码。它会产生奇怪的结果(大约在第18位之后出现很多随机数字。)我试图找到有关sprintf限制的信息,但找不到。我试图弄清楚答案是正确的还是垃圾。当传递0.025(作为两倍)时,它将打印出:
0.025000000000000001387778780781445675529539585113525390625
(31个答案)
2年前关闭。
我最近遇到了这段代码。它会产生奇怪的结果(大约在第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);
}
最佳答案
答案实际上是正确的-不是随机数字。double
通常可以精确表示大约264个不同的值。
0.025不是带有binary64 double
的其中之一。
最接近的double
是0.025000000000000001387 ....
下一个最接近的double
是0.024999999999999997918 ...sprintf()
做得很好。
关于c - sprintf精度限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45381433/
10-13 05:20