我试图将浮点变量写入我的ini文件,并且遇到格式说明符问题。
我有一个浮点值,设为101.9716。现在我想将其写入我的ini文件,但是问题是我有另一个浮点值,其精度较低(例如15.85),并且这些值在同一循环中写入ini文件。
所以我这样做:
sprintf(valLineY, "%g", grade[i].yArr[j]);
我所有其他变量都变成了不错的字符,例如“20”(如果是20.00000),“13.85”(如果是13.850000)等等。但是101.9716由于某种原因变成了“101.972”。
您能告诉我为什么会发生这种情况,以及如何在不破坏我的意识形态的情况下将其设置为“101.9716”(这是关于删除尾随零和不必要的敏锐度)。
谢谢你的帮助。
最佳答案
为什么会这样?
我测试了:
double f = 101.9716;
printf("%f\n", f);
printf("%e\n", f);
printf("%g\n", f);
并输出:
101.971600
1.019716e+02 // Notice the exponent +02
101.972
这是C标准(N1570 7.21.6.1)关于转换说明符
g
的说明:因此,如上所述,由于未指定精度,P将等于6,而X将等于2,因为它是
e
样式的指数。因此,公式6> 2> = -4为真,并且选择了样式
f
。然后精度将为6-(2 + 1)=3。怎么修?
与
f
不同,即使设置了精度,样式g
也会去除不必要的零。因此设置足够高的精度:
printf("%.8g\n", f);
打印品:
101.9716
关于c++ - sprintf%g说明符在点后给出的位数太少,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35475425/