我试图将浮点变量写入我的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/

10-12 14:24