【问题标题】:printf remove the tail 0s [duplicate]printf 删除尾部 0 [重复]
【发布时间】:2015-10-29 07:32:57
【问题描述】:

我有两个双号 ab

double a = 1.01, b = 1.2345678

然后printf("%.4f %.4f", a, b) 将输出

1.0100  1.2345

但我想输出

1.01 1.2345

即去掉无用的0。

【问题讨论】:

  • 它们不是没用的,1.01 是介于1.0051.0149999999... 之间的数字,但1.0100 是介于1.009951.010049999999... 之间的数字。
  • 与编程无关:在一般科学中,在整个计算过程中保持位数一致被认为是正确的风格。所以在大多数情况下,第一种形式是最正确的。

标签: c


【解决方案1】:

%.4f 将始终通过填充零打印最多 4 个十进制。 您可以删除 %.4f 并使用 %g 打印不带零的精确值

g,G double 参数以样式 f 或 e 进行转换(或 F 或 E 用于 G 转换)。精度指定有效位数。如果缺少精度,则给出 6 位数字;如果精度为零,则将其视为 1。如果其转换的指数小于 -4 或大于或等于精度,则使用样式 e。从结果的小数部分中删除尾随零;只有在小数点后跟至少一位数字时才会出现小数点。

【讨论】:

    【解决方案2】:

    不完全是您想要的,但您可以使用 %g 而不是 %f,如下所示:

      double a = 1.01, b = 1.2345678;
      printf("%.4g %.4g\n", a, b);
    

    “g”格式的精度值与“f”格式的精度值不同。 “f”的精度指定小数点后的位数。 “g”的精度指定打印的有效数字的最大数量。

    【讨论】:

      【解决方案3】:

      如果你指定一个宽度......那么你会得到那个宽度。

      只需改用“%g”或“%f”即可。

      来自“man”页面:

      http://linux.die.net/man/3/printf

      克,克

      double 参数转换为 f 或 e 样式(或 F 或 E 为 G 转换)。精度指定显着的数量 位数。如果缺少精度,则给出 6 位数字;如果 精度为零,它被视为 1。如果指数,则使用样式 e 从它的转换小于 -4 或大于或等于 精确。从小数部分删除尾随零 结果;只有在小数点后跟至少一个小数点时才会出现小数点 数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-10
        • 2012-12-09
        • 2011-01-07
        • 2020-07-23
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        相关资源
        最近更新 更多