我正在C中运行一个简单的计算,对于该计算,有时结果恰好为0。然后我使用interface IMe {
id: string;
isActive: boolean;
}
function (meOrPartial: Partial<IMe> | IMe) {
const meKeys = keyof IMe;
// const meKeys = K in IMe;
const isFull = Object.keys(meKeys).every(key => meOrPartial.hasOwnProperty(key));
}
之类的内容打印这些结果。如果结果不为0,则按照我想要的做,例如,输出可能为printf("%0.4g", result)
。但是,如果结果恰好是0(通常是0),则输出将为1.796e+04
。
我的问题是,即使数字可能恰好为0,我该怎么做才能打印0
(带小数点后4位)?
答案 0 :(得分:3)
要有4个小数,必须指定.5
。要使0
打印为0.0
,必须添加#
。
printf("%#.5g", 0.0);
请注意,这将打印4
个小数位,与%0.4g
不同的是,它将打印3个小数位。
不需要点0
前的.
。它用于指定在匹配字段长度时,字段的前缀应为零而不是空格。但是您没有指定字段长度,因此没有前缀发生,因此0
可以省去。
答案 1 :(得分:3)
使用%g
格式和#
修饰符可能会满足您的要求。
printf()
的POSIX规范(通常是C11 §7.21.6.1 The printf()
function的超集,但此处POSIX表示与C11相同)
g
,G
—表示浮点数的 double 参数应以f
或{{1}的样式进行转换}(如果是e
转换说明符,则为F
或E
样式),取决于转换的值和精度。假设G
等于精度(如果非零);如果省略精度则为6;如果精度为零,则等于1。然后,如果样式为P
的转换的指数为E
:
如果为
X
,则转换应采用样式P > X >= -4
(或f
)和精度F
。否则,转换应采用样式
P-(X+1)
(或e
)和精度E
。最后,除非使用'
>P -1
'标志,否则应从结果的小数部分中删除任何结尾的零,如果没有小数部分,则应删除小数点字符。表示无穷大或NaN的 double 参数应以
#
或f
转换说明符的样式进行转换。
因此,通过在转换规范中指定F
(#
)来保留所需的尾随零。
但是,如果要在小数点后4位,则需要使用"%#0.4g"
。
示例代码:
"%#0.5g"
输出(运行macOS 10.14.4 Mojave的Mac-自制的GCC 9.1.0编译器):
#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;
}
您确实认识到普朗克常数和阿伏伽德罗数的近似值,对吗?
答案 2 :(得分:2)
声明
printf("%0.4e\n", res);
可能会解决您的问题!
答案 3 :(得分:1)
您可以使用
printf("%0.4f",YourVeriable);