打印出与原始十进制数

时间:2015-11-15 06:49:49

标签: c precision

我希望能够打印出双精度数s.t它与C语言中的原始十进制数相同。

char buf[1000];
double d = ______;

对于双人,我会做

snprintf(buf, sizeof(buf), "%.17g", .1);

但它会打印出来:printf("%s", buf);

0.10000000000000001

最后1为舍入错误

如果您尝试表示.1,它会打印出最接近的十进制表示双精度值。将.1转换为double,会出现舍入错误。回到十进制,你会得到另一个舍入错误。

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

“标准”解决方案并不漂亮:对所有浮点常量使用十六进制表示法而不是十进制表示法。不幸的是,它们看起来像0x1.7aP-13难以为人类消化的东西。但是有了它们,你就可以保证写出和读回来给你完全相同的价值。

标准C库strtodprintf(格式为%a)和类似工具,如果您有一个至少实现C99的C库,则支持此工具。使用时必须注意的一个小问题是printf的小数点是locale依赖的。因此,如果您的语言环境例如,,则必须确保使用相同的locale进行书写和阅读。

答案 1 :(得分:1)

一般来说,你想做的事情是不可能的。浮点值使用二进制表示,许多带终止十进制表示的值没有精确的二进制表示。

从根本上说,如果要保留十进制表示,则应使用表示该值的数据类型作为小数。

值得指出Python用于显示浮点值的方法。 Python显示最短的十进制表示,其最近的浮点值是显示的值。

0.1为例,该值无法在二进制浮点中精确表示。因此使用最接近的浮点值。当您要求该二进制值的十进制表示时,Python运行时确定0.1float('0.1') == value的最短表示。

如果这种方法对您有用,那么您应该研究这个:https://bugs.python.org/issue1580