我对诸如“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 的转换没有任何类似的效果我认为。