【问题标题】:How to use printf so that zeros are printed with decimals如何使用 printf 以便用小数打印零
【发布时间】:2019-09-29 21:56:26
【问题描述】:

我在 C 中运行一个简单的计算,有时结果正好是 0。然后我使用类似 printf("%0.4g", result) 的东西打印这些结果。如果结果不是 0,它会做我想做的事,例如,输出可能是1.796e+04。但是,如果结果正好是 0(通常是这样),则输出将是 0

我的问题是,我该怎么做才能打印带有 4 位小数的 0.0000,即使那里的数字可能正好是 0?

【问题讨论】:

  • 是否可以接受带有“0”的 5 个空格? IE。 " 0"(cmets合并空格,所以写不出来)
  • 当它是 0 你想显示 0.000 吗?
  • 当结果为1.0E-6时,你看到了什么(希望看到)? IIRC,%g 默认去除尾随零。但是 POSIX 说 最后,除非使用 '#' 标志,否则应从结果的小数部分中删除任何尾随零,如果没有剩余小数部分,则应删除小数点字符。 所以"%#0.4g" 应该可以完成这项工作。
  • 说明符 %0.4g 指定具有 3 个小数位的数字,即。 1.746e+04。要使 0.0000 有 4 个小数位,您需要使用 .5g

标签: c printf double decimal stdio


【解决方案1】:

要拥有 4 位小数,您必须指定 .5。要将0 打印为0.0,您必须添加#

printf("%#.5g", 0.0);

请注意,这将打印 4 小数位,与 %0.4g 不同,它将打印 3 个小数位。

. 之前的 0 是不需要的。它用于指定在匹配字段长度时,该字段应以零而不是空格作为前缀。但是你没有指定字段长度,所以没有前缀,所以0可以省略。

【讨论】:

    【解决方案2】:

    使用带有# 修饰符的%g 格式可能会满足您的需求。

    printf() 的 POSIX 规范(通常是 C11 §7.21.6.1 The printf() function 的超集,但这里 POSIX 表示与 C11 相同)要求:

    • g, G — 表示浮点数的 double 参数应转换为 fe 样式(或 F 或 @ 样式在 G 转换说明符的情况下为 987654332@),具体取决于转换的值和精度。让P 等于精度(如果非零),如果精度被省略,则等于 6,或者如果精度为零,则等于 1。那么,如果样式为E 的转换的指数为X

      • 如果P > X >= -4,则转换应使用样式f(或F)和精度P-(X+1)

      • 否则,转换应使用样式e(或E)和精度P -1

    最后,除非使用 '#' 标志,否则应从结果的小数部分中删除任何尾随零,如果没有剩余小数部分,则应删除小数点字符。

    表示无穷大或 NaN 的 double 参数应以 fF 转换说明符的样式进行转换。

    因此,通过在转换规范中指定 #"%#0.4g",保留所需的尾随零。

    如果你想要小数点后 4 位数字,你需要使用"%#0.5g"

    示例代码:

    #include <stdio.h>
    
    int main(void)
    {
        double data[] = { 0.0, -0.0000001, +1.234E-6, 1.796e+04, 3.14159265, 6.022140857E+23, 6.62607004E-34 };
        enum { NUM_DATA = sizeof(data) / sizeof(data[0]) };
        for (int i = 0; i < NUM_DATA; i++)
            printf("%20.10g = %#0.4g\n", data[i], data[i]);
        return 0;
    }
    

    输出(运行 macOS 10.14.4 Mojave 的 Mac — 自制 GCC 9.1.0 编译器):

                       0 = 0.000
                  -1e-07 = -1.000e-07
               1.234e-06 = 1.234e-06
                   17960 = 1.796e+04
              3.14159265 = 3.142
         6.022140857e+23 = 6.022e+23
          6.62607004e-34 = 6.626e-34
    

    您确实认识普朗克常数和阿伏加德罗数的近似值,不是吗?

    【讨论】:

    • 是的,这是一个非常好的解决方案,并且完全符合我的要求。但是,其他人指出使用 %0.4e,这不是我特别要求的,但我更喜欢这种方法。不过谢谢。
    • 不,我没有注意到旧的 6.022e23,我现在注意到了!
    【解决方案3】:

    声明

    printf("%0.4e\n", res);

    或许能解决你的问题!

    【讨论】:

    • 完美,这完全符合我的要求,我现在得到 0.0000e+00,这比我要求的还要好!现在,当我连续打印多个结果时,一切看起来都对齐且干净。
    【解决方案4】:

    你可以使用 printf("%0.4f",YourVeriable);

    【讨论】:

    • 如何产生1.796e+04
    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多