【发布时间】:2017-05-18 22:33:01
【问题描述】:
我需要在 C 中打印双精度,宽度为 20,但使用可以在 20 个字符中打印的最大精度
例如:
-123.123456789123456789
应该打印出来:
-123.1234567891234568
到目前为止,我有以下代码可以工作,但很难看并且有问题:
double num = .......;
int pr = 0;
char temp[32] = { 0 };
char *point = NULL;
sprintf(temp, "%.20f", num);
point = strchr(temp, '.');
if (point) {
pr = 20 - (1 + point - temp);
}
printf("%20.*f", pr, num);
问题是这不适用于 %g 而不是 %f,它有时会打印超过 20 个字符,即使不存在指数部分。 当给出像 0.000123456789123456789 这样的数字时,就会出现问题。小数点后多余的零似乎不算数(!)。
【问题讨论】:
-
“问题是这不适用于 %g 而不是 %f。” 不够好。要精确。怎么不行?
-
虽然另一篇文章的 OP 并不关心 answer ,但这正是这个 OP 想要的——我想。问题是存在使使用预先计算的格式不是最佳的极端情况。链接的答案尝试了各种
"%.*e"解决方案。 -
为什么要输出为
-123.123456789123456而不是更精确的-123.123456789123457? (检查最后一位) -
1) "print doubles in C, width of 20" --> 你想如何打印
double像DBL_MAX这样可能需要300+ 位?或者你想跳到指数符号? 2) 正数 +123.123456789123456789 是否应该多打印 1 个小数位为"123.1234567891234567"? -
"%g"并不总是满足“使用可以打印的最大精度”的要求,而是通过几乎相似的标准跳到指数级。哪个更重要:最大精度、易于编码、所有double的正确性?