0

我对诸如“g_ascii_dtostr”(以及使用双精度的 GKeyFile 函数)之类的 glib 函数的工作方式有点感兴趣。

考虑这一行:

gchar buf[30];
g_message("Double: %f, as String: %s", 0.2, g_ascii_dtostr(buf, 30, 0.2));

哪个输出

Double: 0.200000, as String: 0.20000000000000001

(奇怪的转换只有在我将缓冲区大小设置得足够高时才会发生)

当我(例如)将双“1.9”存储在 GKeyFile 中时会发生类似的事情,但在生成的文件中它被保存为“1.8999999999999999”。显然,通过“g_ascii_strtod”返回的转换应该是无损的,但它仍然困扰着我为什么首先会发生这种奇怪。这也使我的配置键值文件非常难看..

我想我曾经在某处读过使用了中间“long double”类型,但这仍然不能解释为什么转换后的值是“脏的”,因为例如从 int 到 double for 的转换没有任何类似的效果我认为。

4

1 回答 1

1

文档中

“这个函数产生足够的精度,使用 g_ascii_strtod() 将字符串转换回来给出相同的机器编号(在具有 IEEE 兼容的 64 位双精度的机器上)。”

正如 caf 在他的评论中指出的那样, %f 说明符在六位十进制数字后截断,因此 g_ascii_strtod() 为您提供更准确的值。如果你想要这种截断,你可以使用 g_ascii_formatd()。

于 2013-11-08T00:31:29.273 回答