C - printf 在变量中传递的精度(十进制位数)的浮点值



我可以打印精度为 3 位十进制数字的浮点值

double f = 1.23456;
printf( "%.3f", f );

现在我有请求的十进制数字的数量,它不是固定的,而是存储在变量中的

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

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

我可以通过编程方式编写printf格式字符串,但我想知道是否有更简单的方法可以做到这一点。

使用".*"

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

例:

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

精度

这称为精度场。根据手册页,

精度

:可选精度,格式为句点 ('.'(,后跟可选的十进制数字字符串。可以写"*"或"*m$"(对于某个十进制整数 m(代替十进制数字字符串,以指定精度分别在下一个参数或第 m 个参数中给出,该参数必须是 int 类型。 如果精度仅以"."给出,或者精度为负数,则精度为零。这给出了 d、i、o、u、x 和 X 转换要显示的最小位数,a、a、e、E、f 和 F 转换的基数字符后显示的位数,g 和 G 转换的最大有效位数,或 s 和 S 转换要从字符串中打印的最大字符数。

宽度

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

>>> printf("%*sn", 10, "left?")
"     left?"
>>> printf("%*sn", -10, "left?")
"left?     "

根据手册页,

字段宽度

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

最新更新