让printf()删除值为".0"的值

Sus*_*nna 5 c printf

我需要使用以下格式要求打印浮点数:

  • 5.12345 应该只显示 5.1

  • 5.0应该只5(没有.0)

  • 5.0176应该只显示5(没有.01)

我以为printf()可以做这样的事......但现在我似乎无法让它发挥作用.

Jas*_*son 8

你可以使用"%g"得到你想要的结果

#include <stdio.h>

int main(int argc, char* argv[])
{
        printf("%.6g\n", 5.12345f);
        printf("%.6g\n", 5.0f);
        printf("%.6g\n", 5.0176f);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

5.12345
5
5.0176
Run Code Online (Sandbox Code Playgroud)

"%g"将删除尾随零.

  • `%.2g`将通过所有三个OP的测试. (6认同)
  • @Max,我查看了联机帮助页.如果他说'%.2g`,并打印'100`,他得到`1.00e + 02`(如果指数大于或等于精度,科学风格由'%g`使用).我想这可能不是他想要的. (3认同)

pli*_*nth 1

不是你描述的那样,不。如果你想要有条件的小数位,你必须自己做。

我已经有一段时间没有使用 printf 格式了,但这似乎在大多数情况下都有效

char *BuildConditionalFormat(double val)
{
    int tenths = (int)(val * 10) % 10;
    if (tenths == 0)
        return ".0f";
    return ".1f";
}

/* test rig */
float f = 5.0;
printf(BuildConditionalFormat(f), f); /* -> 5 */
f = 5.13;
printf("\n");
printf(BuildConditionalFormat(f), f); /* -> 5.1 */
printf("\n");
Run Code Online (Sandbox Code Playgroud)

这遵守了你的规则,但也提供了一个有趣的教训,说明为什么浮点很糟糕,因为 5.1 -> 5。为什么?因为 5.1 并不能(在我的机器上)清楚地表示为浮点数 - 它是 5.09999 以及更多变化。

您可能还需要了解 Floor() 和 ceil()...