Pao*_*olo 3 c floating-point precision printf string-formatting
我可以打印精度为3位十进制数的浮点值
double f = 1.23456;
printf( "%.3f", f );
Run Code Online (Sandbox Code Playgroud)
现在我有一些请求的十进制数字,这些数字不是固定的,而是存储在变量中
int precision;
precision = atoi( argv[ 1 ] ); // ...just for example
double f = 1.23456;
Run Code Online (Sandbox Code Playgroud)
如何f使用指定的小数位数打印值precision?
我可以以编程方式编写格式字符串,printf但我想知道是否有更简单的方法来完成它.
使用 ".*"
printf("%.*f", precision, f);
Run Code Online (Sandbox Code Playgroud)
例:
>>> printf("%.*f", 5, 3.14)
"3.14000"
Run Code Online (Sandbox Code Playgroud)
这称为精度字段.根据手册页,
精度:可选精度,以句点('.')的形式,后跟可选的十进制数字字符串.可以写"*"或"*m $"(对于某些十进制整数m)来指定精度在下一个参数或第m个参数中给出,而不是十进制数字串,必须是int类型 如果精度仅为'.',或精度为负,则精度为零.这给出了d,i,o,u,x和X转换的最小位数,即a,e,E,f和F转换的基数字符后出现的位数, g和G转换的最大有效位数,或s和S转换的字符串打印的最大字符数.
width字段类似,适用于更多格式,例如"%*s".只需删除..它将根据需要使用空格或零填充输出.如果precision为负数,则字符串将左对齐.
>>> printf("%*s\n", 10, "left?")
" left?"
>>> printf("%*s\n", -10, "left?")
"left? "
Run Code Online (Sandbox Code Playgroud)
根据手册页,
字段宽度:可选的十进制数字字符串(具有非零的第一个数字),指定最小字段宽度.如果转换后的值的字符数少于字段宽度,则会在左侧填充空格(如果已给出左侧调整标记,则填充右侧).可以写"*"或"*m $"(对于某些十进制整数m)而不是十进制数字串来指定字段宽度分别在下一个参数或第m个参数中给出,这必须是属于int类型.负字段宽度被视为' - '标志,后跟正字段宽度.在任何情况下,不存在或小的字段宽度都不会导致字段截断; 如果转换结果比字段宽度宽,则扩展该字段以包含转换结果.