printf一个浮点值,其精度(小数位数)在变量中传递

时间:2016-01-31 23:54:36

标签: c floating-point printf string-formatting precision

我可以使用

打印精度为3位十进制数的浮点值
double f = 1.23456;
printf( "%.3f", f );

现在我有一些请求的十进制数字,这些数字不是固定的,而是存储在一个变量

int precision;
precision = atoi( argv[ 1 ] ); // ...just for example
double f = 1.23456;

如何使用f中指定的小数位数打印precision的值?

我可以通过编程方式为printf编写格式字符串,但我想知道是否有更简单的方法来执行此操作。

1 个答案:

答案 0 :(得分:8)

使用".*"

printf("%.*f", precision, f);

示例:

>>> printf("%.*f", 5, 3.14)
"3.14000"

精密

这称为精度字段。 根据{{​​3}},

  

精度:可选精度,以句点('。')的形式,后跟可选的十进制数字字符串。可以写" *"而不是十进制数字串。或" * m $" (对于某些十进​​制整数m)指定精度在下一个参数或第m个参数中给出,它们必须是int类型。 如果精度仅为'。'或精度为负,则精度为零。这给出了d,i,o,u,x和X转换的最小位数,即a,e,E,f和F转换的基数字符后出现的位数, g和G转换的最大有效位数,或s和S转换时字符串中打印的最大字符数。

宽度

宽度字段类似,适用于更多格式,例如"%*s"。只需删除.即可。 它将根据需要使用空格或零填充输出。 如果precision为负数,则字符串将左对齐。

>>> printf("%*s\n", 10, "left?")
"     left?"
>>> printf("%*s\n", -10, "left?")
"left?     "

根据man pages

  

字段宽度:可选的十进制数字字符串(具有非零的第一个数字),指定最小字段宽度。如果转换后的值的字符数少于字段宽度,则会在左侧填充空格(如果已给出左侧调整标记,则填充右侧)。可以写" *"而不是十进制数字串。或" * m $" (对于某些十进​​制整数m)指定字段宽度分别在下一个参数或第m个参数中给出,它必须是int类型。 负字段宽度被视为' - '标志后跟正字段宽度。在任何情况下,不存在或小字段宽度都不会导致字段截断;如果转换结果宽于字段宽度,则字段将展开以包含转换结果。