如何使用 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
您确实认识普朗克常数和阿伏伽德罗常数的近似值,不是吗?
我是 运行 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 stylef
ore
(or in the styleF
orE
in the case of aG
conversion specifier), depending on the value converted and the precision. LetP
equal the precision if non-zero, 6 if the precision is omitted, or 1 if the precision is zero. Then, if a conversion with styleE
would have an exponent ofX
:
If
P > X >= -4
, the conversion shall be with stylef
(orF
) and precisionP-(X+1)
.Otherwise, the conversion shall be with style
e
(orE
) and precisionP -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
orF
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
您确实认识普朗克常数和阿伏伽德罗常数的近似值,不是吗?