如何使用 printf 使零与小数一起打印

How to use printf so that zeros are printed with decimals

我是 运行 C 中的一个简单计算,有时结果恰好为 0。然后我使用 printf("%0.4g", result) 之类的东西打印这些结果。如果结果不为 0,它会执行我希望它执行的操作,例如,输出可能是 1.796e+04。但是,如果结果恰好为 0(通常是这样),则输出将为 0.

我的问题是,即使那里的数字可能正好是 0,我该如何打印 0.0000,保留 4 位小数?

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

声明

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

可能会解决您的问题!

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

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

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

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

使用带有 # 修饰符的 %g 格式可能会达到您想要的效果。

printf() (which is generally a superset of C11 §7.21.6.1 The printf() function的POSIX规范,但这里POSIX表示与C11相同)要求:

  • g, G — The double argument representing a floating-point number shall be converted in the style f or e (or in the style F or E in the case of a G conversion specifier), depending on the value converted and the precision. Let P equal the precision if non-zero, 6 if the precision is omitted, or 1 if the precision is zero. Then, if a conversion with style E would have an exponent of X:

    • If P > X >= -4, the conversion shall be with style f (or F) and precision P-(X+1).

    • Otherwise, the conversion shall be with style e (or E) and precision P -1.

Finally, unless the '#' flag is used, any trailing zeros shall be removed from the fractional portion of the result and the decimal-point character shall be removed if there is no fractional portion remaining.

A double argument representing an infinity or NaN shall be converted in the style of an f or F conversion specifier.

因此,通过在转换规范中指定 # 保留您想要的尾随零 — "%#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;
}

输出(Mac 运行 macOS 10.14.4 Mojave — home-built 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

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