printf浮点数的可变小数位数

时间:2013-05-07 07:32:54

标签: c printf

我找到了有趣的格式来打印非终止的固定长度字符串,如下所示:

char newstr[40] = {0};
sprintf(newstr,"%.*s",  sizeof(mystr), mystr);

所以我想也许在printf命令下有一种打印浮点数的方法......

  

“%8.2f”

能够选择带整数的小数位数。

这样的事情:

sprintf(mystr, "%d %f", numberofdecimals, floatnumbervalue)

编辑 - 解决方案:
(用于将浮点数舍入和清除到所需精度)。

int precision = 2;  
char kolf[16] = {0};  
sprintf(kolf, "%8.*f", precision, mystruct.myfloat);  
float kol = atof(kolf);  

3 个答案:

答案 0 :(得分:37)

您也可以将".*"与浮点一起使用,另请参阅http://www.cplusplus.com/reference/cstdio/printf/(指C ++,但格式说明符类似)

  

.number :对于a,A,e,E,f和F说明符:这是要指的位数   在小数点后打印(默认情况下,这是6)。

     

...

     

。* :未在格式字符串中指定精度,但是作为   必须的参数前面的附加整数值参数   格式化。

例如:

float floatnumbervalue = 42.3456;
int numberofdecimals = 2;
printf("%.*f", numberofdecimals, floatnumbervalue);

输出:

42.35

答案 1 :(得分:19)

您也可以使用星号,包括字段宽度和精度:

printf("%*.*f\n", myFieldWidth, myPrecision, myFloatValue);

参见例如this reference

答案 2 :(得分:0)

如果由于某种原因,您的实际 C 库不支持浮点格式的可变精度和宽度,那么构建您自己的格式字符串并不难:

char fmt[6 + 3*(sizeof width + sizeof precision)]; /* sufficient space */
sprintf(fmt, "%%%d.%df\n", width, precision);
printf(fmt, value);

当然这是有代价的,但是 - 根据您的情况 - 这可能是集中的。