c - 油嘴滑舌:g_ascii_dtostr 不精确?

标签 c string double glib double-precision

我对一些 glib 函数的工作方式有点感兴趣,例如“g_ascii_dtostr”(以及使用 double 的 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

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

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

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

最佳答案

来自the documentation :

“此函数生成足够的精度,可以使用 g_ascii_strtod() 将字符串转换回相同的机器编号(在具有 IEEE 兼容 64 位 double 的机器上)。”

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

关于c - 油嘴滑舌:g_ascii_dtostr 不精确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687295/

相关文章:

c - 字符串操作C编程

c - 将 &var 传递给 *var 和将 var 传递给 var 有什么区别?

c - srand 和 rand 的未定义行为

java - 如何将字符串转换为字符串[][]

python - python 2.7中输入二维n*n数组

c++ - 如何在一行上连接多个 C++ 字符串?

c - 双字段的 calloc() 是否总是计算为 0.0?

c++ - 莱克斯/柔性 :Regular expression for string literals in C/C++?

mysql - 加速: SELECT statement on DOUBLE

Swift double 到字符串