【发布时间】:2012-04-26 06:16:24
【问题描述】:
在 UNIX 中使用 sprintf() 将 double 值转换为字符串时遇到一个特定问题。
例如我有两个值:
double a = 0.009984354523452;
double b = 0.01;
在转换时,我正在使用:
sprintf(somestringvar, "Double value : %.15f \n", a);
sprintf(diffstringvar, "Double value : %.15f \n", b);
转换为字符串。
我的问题是'a',该值打印正确,但对于'b'的值,0 被附加在尾端。请提供任何将“a”和“b”表示为精确值的常用方法。
【问题讨论】:
-
我会用 std::ostringstream 来做这种事情。
-
一般情况下,不要使用
sprintf(),因为它会导致缓冲区溢出。请改用snprintf(),或Microsoft 在Windows 上提供的_s“安全”版本之一。 p.s.欢迎使用 Stack Overflow! -
您好,感谢您的早期回复。 ostringstream 没有完全精确。一个值仅打印为 0.009976。我可以使用 snprintf() 但问题在于正确打印值。
-
您必须注意的另一件事:通常,浮点数不能精确表示,因为尾数只有有限的长度。例如。
printf("1/10 = %.50f\n", 0.1);在我的机器上输出以下内容:d = 0.10000000000000000555111512312578270211815834045410。您可能想阅读floating point representation。 -
这是很有价值的信息。确实,浮点数不能准确表示,但我只是试图打印特定双变量中存在的值。我实际上是从数据库访问数据,在这种情况下,我必须准确地向用户打印数据库中的任何内容。但不是通过“规范化”或“截断”或“在尾部附加零”。通过使用 %g 或 %f 或 ostringstream,如果我使用 %.20f 大值可以正常化和截断值(如 0.009984354523452 为 0.009984),但小的值如 0.01 为 0.0100 ..... 18 个零