我可以使用
打印精度为3位十进制数的浮点值double f = 1.23456;
printf( "%.3f", f );
现在我有一些请求的十进制数字,这些数字不是固定的,而是存储在一个变量
中int precision;
precision = atoi( argv[ 1 ] ); // ...just for example
double f = 1.23456;
如何使用f
中指定的小数位数打印precision
的值?
我可以通过编程方式为printf
编写格式字符串,但我想知道是否有更简单的方法来执行此操作。
答案 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类型。 负字段宽度被视为' - '标志后跟正字段宽度。在任何情况下,不存在或小字段宽度都不会导致字段截断;如果转换结果宽于字段宽度,则字段将展开以包含转换结果。