任何人都可以解释%g和%f之间的区别。 我知道%0.2f,因为据我所知,它仅在点2位小数后打印! 我试过这段代码......
int main()
{
float val = 10.0;
printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);
return 0;
}
//giving : <10><10><10><10.000000><10.00>
//If i give 10.1 instead!
int main()
{
float val = 10.1;
printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);
return 0;
}
//giving : <10.1><10><10.1><10.000000><10.00>
// How come here i got for %g --> 10.1
// %0.2g --> 10
// %0.4g --> 10.1
请有人澄清我!
答案 0 :(得分:0)
%g
和%G
的Linux程序员手册:
因此,在此之前。是场宽;之后。是结果中有效数字的最大数字,但删除了尾随零。具有4位有效数字的10.10000是10.10,但是尾随零删除结果为10.1。有2位有效数字,得分为10.双参数以样式f或e(或G或E转换为G转换)转换。 精度指定重要数量 数字。如果缺少精度,则给出6位数字;如果精度为零,则将其视为1.如果指数来自其,则使用样式e 转化率小于-4或大于或等于 精确度。尾随零从结果的小数部分中删除;只有小数点才出现 之后至少有一位数。
%g
等于%.6g
。
但请注意第二部分:
如果指数来自它,则使用样式e 转化率小于-4或大于或等于 精确度。
这意味着使用%0.2g
格式化的100会产生1e+02
答案 1 :(得分:0)
在Eclipse / Microsoft C编译器环境中运行了代码的副本。
总的来说,%g有两种可能的行为,一种是指数大于或等于-4,一种是1 * 10 ^ -4 = 0.0001,另一种是当指数<1时。 -4,如0.00001。
// Microsoft C compiler "handles" void main()
void main()
{
// Note. Exponent is 1
float val = 10.0;
printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);
// Exponent is still 1
val = 10.1;
printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);
// Exponent is -5, and the %g format specifier behaves as you expect
val = 0.000011;
printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);
// output == <1.1e-005><1.1e-005><1.1e-005><0.000011><0.00>
}
您的代码的行为与ANSI C标准一致,其性能与您将printf
与main()
语句无关的内容编码完全无关。