1

我正在尝试将浮点变量写入我的 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”(这是关于删除尾随零和不需要的感知)。谢谢你的帮助。

4

1 回答 1

4

为什么会发生这种情况?

我测试过:

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

根据转换的值和精度,double表示浮点数的参数以样式fe(或以样式FE在 G 转换说明符的情况下)进行转换。如果不为零,则令P等于精度,如果省略精度,则令 P 等于 6,如果精度为零,则令 P 等于 1。然后,如果带有样式的转换E的指数为X

— 如果P > X ≥ −4,则转换为样式f(or F) 和精度 P - (X + 1)

— 否则,转换使用样式e(or E) 和精度P - 1

因此,上面给出的P将等于 6,因为未指定精度,而X将等于 2,因为它是 style 的指数e

因此公式6 > 2 >= -4为真,并且f选择了样式。然后精度将是6 - (2 + 1) = 3

怎么修?

与 不同的是,即使设置了精度f,样式g也会去除不必要的零。

最后,除非#使用该标志,否则将从结果的小数部分中删除任何尾随零,如果没有剩余小数部分,则删除小数点字符。

所以设置足够高的精度:

printf("%.8g\n", f);

印刷:

101.9716
于 2016-02-18T08:51:00.830 回答