我对某些glib函数(如“g_ascii_dtostr”(以及使用双精度的GKeyFile函数)的工作方式有点兴趣。
考虑这一行:
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
(奇怪的转换仅在我将缓冲区大小设置得足够高时才会发生)
类似的事情发生在我(例如)在GKeyFile中存储双“1.9”时,但在结果文件中它保存为“1.8999999999999999”。 显然,通过“g_ascii_strtod”的转换应该是无损的,但它仍然困扰我为什么这个奇怪的事情首先发生。这也使我的配置键值文件非常难看..
我想我曾经读过一个中间的“long double”类型,但是这仍然不能说明为什么转换后的值是“脏”的,因为例如从int到double的转换我认为没有任何类似的效果。
答案 0 :(得分:1)
“此函数生成足够的精度,使用g_ascii_strtod()转换字符串会产生相同的机器编号(在具有IEEE兼容64位双精度的计算机上)。”
正如caf在他的评论中指出的那样,%f说明符在六位小数后截断,因此g_ascii_strtod()为您提供更准确的值。如果要截断,可以使用g_ascii_formatd()。