我希望能够打印出双精度数s.t它与C语言中的原始十进制数相同。
char buf[1000];
double d = ______;
对于双人,我会做
snprintf(buf, sizeof(buf), "%.17g", .1);
但它会打印出来:printf("%s", buf);
0.10000000000000001
最后1
为舍入错误
如果您尝试表示.1
,它会打印出最接近的十进制表示双精度值。将.1
转换为double,会出现舍入错误。回到十进制,你会得到另一个舍入错误。
有没有办法解决这个问题?
答案 0 :(得分:1)
“标准”解决方案并不漂亮:对所有浮点常量使用十六进制表示法而不是十进制表示法。不幸的是,它们看起来像0x1.7aP-13
难以为人类消化的东西。但是有了它们,你就可以保证写出和读回来给你完全相同的价值。
标准C库strtod
,printf
(格式为%a
)和类似工具,如果您有一个至少实现C99的C库,则支持此工具。使用时必须注意的一个小问题是printf
的小数点是locale
依赖的。因此,如果您的语言环境例如,
,则必须确保使用相同的locale
进行书写和阅读。
答案 1 :(得分:1)
一般来说,你想做的事情是不可能的。浮点值使用二进制表示,许多带终止十进制表示的值没有精确的二进制表示。
从根本上说,如果要保留十进制表示,则应使用表示该值的数据类型作为小数。
值得指出Python用于显示浮点值的方法。 Python显示最短的十进制表示,其最近的浮点值是显示的值。
以0.1
为例,该值无法在二进制浮点中精确表示。因此使用最接近的浮点值。当您要求该二进制值的十进制表示时,Python运行时确定0.1
是float('0.1') == value
的最短表示。
如果这种方法对您有用,那么您应该研究这个:https://bugs.python.org/issue1580