【问题标题】:Printf variable number of decimals in floatPrintf 浮点数中的可变小数位数
【发布时间】:2013-05-01 02:03:34
【问题描述】:

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

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

所以我认为 printf 命令下可能有一种方法可以打印浮点数...

“%8.2f”

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

类似这样的:

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

【问题讨论】:

  • 删除:编辑 - 解决方案:(用于将浮点数舍入和清除到所需的精度)。 c int precision = 2; char kolf[16] = {0}; sprintf(kolf, "%8.*f", precision, mystruct.myfloat); float kol = atof(kolf);

标签: c printf


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您也可以将".*" 与浮点一起使用,另见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
    

    【讨论】:

      【解决方案3】:

      您也可以使用星号来表示字段宽度和精度:

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

      参见例如this reference.

      【讨论】:

      • 谢谢 Joach,这就是我要搜索的内容。
      • +1 链接到en.cppreference.com 的“C”部分 - 已添加书签:)
      猜你喜欢
      • 2022-11-18
      • 2013-08-26
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多