14.4.9 浮点数输出和显示精度
默认情况下,C++采用前面printf函数%g说明符的格式,6位有效数字,不输出无意义的0。此外,ios_base类还定义了fixed(定点计数法)和scientific(科学记数法)两种输出模式,其中fixed意味着不管数字长度如何,使用格式567.89表示浮点值,而scientific意味着恒使用5.6789+e002形式,如果两个标志位均为0,采用默认形式。
如果不指定精度,fixed和scientific都默认为6位小数,但可以使用ios_base类提供的precision函数指定浮点数的小数位数,precision函数同样有以下两种调用形式。
int ios_base:precision();//返回当前精度 int ios_base:precision(int n);//设置当前精度为n,并返回原来的精度
同fill函数一样,precision函数同样一直有效,直到有新的精度值并设定为止,但要特别注意的是precision函数的精度值设定影响的仅是浮点型数据,对整型数据或其他类型没有影响,如示例代码14.13所示。
代码14.13 浮点数数据与精度设置PrecisionSample
<————————————文件名:example1413.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 double pi=3. 1415926535; 06 int num=200; 07 cout<<"默认精度为:"<<cout.precision()<<"位"<<endl; 08 cout<<"默认表达方式:"<<num<<","<<pi<<endl; 09 //按值大小,相当于printf函数的%g模式,6位有效数字 10 cout. setf(ios:scientific,ios:floatfield);//设定为科学记数法 11 cout<<"科学记数法表达方式:"<<num<<","<<pi<<endl; 12 cout. setf(ios:fixed,ios:floatfield);//设为定点,取消科学记数法表达方式 13 cout<<"定点表达方式:"<<num<<","<<pi<<endl; 14 cout. precision(9);//精度为9位 15 cout. setf(ios:scientific,ios:floatfield);//设定为科学记数法 16 cout<<"定点9位表达方式:"<<num<<","<<pi<<endl; 17 cout. setf(ios:fixed,ios:floatfield);//设为定点,取消科学记数法表达方式 18 cout<<"科学记数9位表达方式:"<<num<<","<<pi<<endl; 19 cout. unsetf(ios_base:floatfield);//设置:既非定点,又非科学记数法 20 cout<<"默认方式下:"<<num<<","<<pi<<endl; 21 return 0; 22 }
输出结果如下所示。
默认精度为:6位 默认表达方式:200,3.14159 科学记数法表达方式:200,3.141593e+000 定点表达方式:200,3.141593 定点9位科学记数法表达方式:200,3.141592654e+000 科学记数法9位表达方式:200,3.141592654 默认方式下:200,3.14159265
【代码解析】从代码14.13的输出结果可以看出,精度的设置只对浮点数起作用,代码第7行的语句输出默认的精度为6位,对定点显示法,其对应于printf函数的%f,精度指的是小数的位数,科学记数法对应于printf函数的%e,精度同样指的是小数的位数,但如果既非fixed,又非scientific时采用默认输出方式,对应printf函数的%g,精度指的是有效数字的位数。
注意
在新的C++标准中,fixed和scientific输出模式都会输出末尾无意义的0以满足精度的需求,而在旧标准中,末尾的0是不会显示的,除非对showpoint常量进行了设置。