在C ++中输出具有常量字符数的浮点值

时间:2012-02-29 17:04:22

标签: c++ formatting floating-point

我在做我认为应该是C ++中相当简单的任务时遇到了麻烦。我正在尝试输出要写入日志文件的浮点值。日志文件有7个字符指定数字输出,但我发现在不同幅度,符号和精度的宽范围值上获得恒定的7字符输出有点不重要(例如:1, - 0.60937,0.60937,0.009371,-0.009371)。我有点被黑客攻击的方式:

int desiredPrecision = 6;
if (runningAvg < 0)
  desiredPrecision--;
if (std::abs((long) runningAvg) < 1)
  desiredPrecision--;
else
  theFile << std::showpoint;

theFile.precision (desiredPrecision);

theFile.fill('0');
theFile.setf(std::ios_base::left, std::ios_base::adjustfield);
theFile.width(7);
theFile << runningAvg << std::endl;

但这种方式对我来说似乎非常黑客。它适用于以下数字: -0.60937(输出:-0.6094)

-1.7(-1.7000)

-1(-1.0000)

0.6937(0.60937)

0.00937(0.00937)

但它打破了 0.009371(0.009371)

-0.009371(-0.009371)

现在,我可以添加另一个if-else语句来处理小幅度的数字,但这似乎只是增加了hackiness的程度,而不是一个干净的方法。我用fprintf玩了一下,但似乎它更关注精确的严格数学定义,而在这个应用程序中我更关心的是将字段的宽度始终限制为7个字符。 (我也可以依赖这些数字永远不会那么大,我会溢出6个字符加上一个符号)

我错过了一些明显的东西吗?任何人都有任何提示,以较少的黑客方式实现这一目标?

3 个答案:

答案 0 :(得分:1)

不知道如何使用iostream内容完成此操作,但我认为您正在寻找的?printf格式字符串就是其中之一:

  • %.4f代表负数,%07.5f代表正数。
  • %+.4f(正数将有一个前导+
  • % .4f(正数将有一个领先的空格)

答案 1 :(得分:1)

最简单的方法是打印成一个字符串并切断字符串 您实际上正在进行文本处理/报告生成而不是浮点数处理,将其视为格式问题

答案 2 :(得分:1)

如果您不关心精确度(或者对所有数字使用相同的精度),您可以对所有数字使用相同的"%7.0e"格式。

Example

#include <stdio.h>

static const char* format = "%7.0e";

int main() {
  double a[] = {1, -0.60937, 0.60937, 0.009371, -0.009371,
               -1, -1.2e8, 1e-4, 1e-5, -1.5e-321, 0/.0, 1/0.};
  for (unsigned i = 0; i < sizeof(a) / sizeof(*a); ++i) {
    printf(format, a[i]);
    puts("");
    if (snprintf(0,0, format, a[i]) != 7)
      return 1;
  }
}

输出

  1e+00
 -6e-01
  6e-01
  9e-03
 -9e-03
 -1e+00
 -1e+08
  1e-04
  1e-05
-2e-321
    nan
    inf