在C++中,浮点数表现为小数或者以科学计数法表示的指数。printf()函数使用e/E、f/F、g/G和a/A来打印浮点数。
1 e和E参数
printf()函数的type类型是e和E参数时,将打印以科学计数法表示浮点数。例如,
float f = 1.23f;
printf("%e", f);
此时的输出为1.230000e+00。默认情况下e前面尾数小数位是6位,不足6位则不零;e后面的指数是2位或者3位。当要输出的值的小数位超过6位时,则使用四舍五入的方法,只保留6位。例如
float f = 1.2345678f;
printf("%e", f);
此时的输出为1.234568e+00。
E和e的用法类似,使用E时,用“E”来表示指数,例如
float f = 1.23f;
printf("%E", f);
此时的输出为1.230000E+00。
2 f和F参数
printf()函数的type类型是e和E参数时,将打印以小数的方式表示浮点数。例如
float f = 1.23f;
printf("%f", f);
此时的输出是1.230000。默认情况下,小数点后保留6位有效数字,如果要打印数值的小数位数超过6位,则使用四舍五入的方法保留6位有效数字。
F和F的用法类似,使用F时,输出的无穷大是大写“INF”,而使用f输出无穷大时是小写的“inf”。
3 g和G参数
printf()函数的type类型是g和G参数时,可以看做是e/E和f/F两个参数的组合,根据要打印的值在这两组参数之间进行切换。当指数值小于-4或者大于等于精度时,切换到e/E参数,否则使用f/F参数。但是需要注意的是,无论是哪种参数,如果要输出的值有效位数不足6位,printf()的输出也不会补零。
例如,
float f = 1.23f;
printf("%g", f);
此时的输出是1.23。使用小数格式显示的1.23,使用科学计数法格式显示,则为1.23e+00,比科学计数法更“短”,因此此时%g切换为%f。
如下代码
float f = 0.000012345f;
printf("%g", f);
此时的输出是1.2345e-05,因为此时比使用小数显示的0.000012345更“短”,%g参数切换为%e。
使用%g时,e前面的尾数默认的总长为6位(注意不是小数位,而是总长),要显示的值超过6位则使用四舍五入保留6位。
float f = 1.23456789f;
printf("%g", f);
此时,%g切换为%f,并且四舍五入保留6位,其输出为1.23457。
当使用%G时,会根据相应条件切换到%E和%F。
4 a和A参数
printf()函数的type类型是a和A参数时,使用p-计数法显示数字。以p-计数法显示的数以0x开头,然后是十六进制浮点数部分,接着是p,后面是以 2为底的阶码。例如,0xb.1p2,将其转换为10进制为(11+1*(1/16))*22。所以,
double f = 5;
printf("%a", f);
此时,显示的内容是0x1.4000000000000p+2,将其化为十进制的表达式为(1+4*(1/16))*22=5。
A和a的用法类似,使用A时,输出的前缀变为“0X”,“P”表示基数,用大写字母“ABCDEF”表示十六进制数。