1

什么单一格式字符串可用于打印 0.0, 1.0, 0.025 ?例如给定:

float vals[3] = { 0.0f, 1f, 0.025f };

for(int i=0; i < 3; i++)
    printf("%g\n", vals[i]);

所需的输出:

0.0
1.0
0.025

而是得到:

0
1
0.025

尝试了各种宽度说明符和 %f vs %g 但无法得到我想要的。

如果有一个 c++ 替代方案就可以了。

4

3 回答 3

3

您可以使用 setprecision(int n),其中 n 是要输出的小数位数。除非您使用固定符号,否则不会显示任何尾随零

#include <iostream>
#include <iomanip>

float vals[3] = { 0.0f, 1.0f, 0.025f };
std::cout << setprecision(5);
for(int i=0; i < 3; i++)
std::cout << vals[i];

输出

0.0
1.0
0.025

将以下内容更改为固定符号

cout << setprecision(5) << fixed;

输出

0.00000
1.00000
0.02500

编辑:还有科学记数法,你可以弄清楚它的作用。setprecision() ---> std::setprecision()

于 2012-05-09T01:34:15.577 回答
2

您可以在打印时指定浮点数和双精度数的小数位后的精度。这是通过格式说明符完成的,例如: %.Nf 其中 N 是一个正整数。因此,如果您使用:

printf("%.3f\n", vals[i]);

你的输出是:

0.000
1.000
0.025

但是你不能让它完全按照你声明的方式打印。您必须在循环的不同阶段更改精度(前 2 次迭代为 %.1f,最后一次迭代为 %.3f)。printf 有很多选项,包括前导空格:

http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html

编辑:

因此,如果您想按照评论中的说明打印至少 1 个小数位,您可以为该情况添加一个明确的检查:

#include <math.h>
#include <stdio.h>

int 
main(int argc, char *argv[]) {
  float vals[3] = { 0.0f, 1.0f, 0.025f };

  for(int i=0; i < 3; i++) {
    if( fmod(vals[i],1) == 0) printf("%.1f\n", vals[i]);
    else printf("%f\n", vals[i]);
  }

  return 1;
}

输出:

0.0
1.0
0.025000
于 2012-05-09T01:34:41.730 回答
1

您可以使用 * 告诉 printf 精度将来自 int 参数值。

printf("%.*f\n", (vals[i] == (int)vals[i]) ? 1 : 3 ,vals[i]);

应该打印:

0.0
1.0
0.025
于 2012-05-09T01:50:55.127 回答