setf函数有两个原型:
- fmtflags setf(fmtflags flags);
- fmtflags setf(fmtflags flags, fmtflags mask);
ios_base类有一个受保护的数据成员,其中的各位(flag)分别控制着格式化的各个方面,如基数{hex,oct,dec},是否显示正数前面的+号,打开一个标志位就是设置该标志位,即设置为1;
对于第一个原型fmtflags setf(fmtflags flags)就是设置相应的标志位,同时返回以前的标志参数;
fmtflags是bitmask类型,以下是一些常用量:
常量 | 含义 |
ios_base::boolalpha | 输入和输出bool值,可以为true或者false |
ios_base::showbase | 对于输出,使用C++前缀(0for Octal, 0Xfor hexadecimal) |
ios_base::showpos | 在正数前面加上+(decimal) |
ios_base::uppercase | 对于16进制输出来使用大写字母,E表示法 |
ios_base::showpoint | 显示末尾的小数点 |
对于第二个原型fmtflags setf(fmtflags, fmtflags);第一个参数和第一个原型一样,都是设置格式,第二个参数是mask,意思是要清除第一个参数中的哪些位;举例说明:将第3位设置为1表示以10为基数,将第4位设置为1表示以8为基数,将第5位设置为1表示以16为基数,假如现在输出是以10为基数,则需要清除第3位的1,设置为0,设置第5位为1;
格式可以理解为fl = (fl & ~mask) | (flags & mask)
简而言之就是说mask表示了哪些位要被设置,而flags表示这些位设置成什么
fmtflags mask | fmtflags:flags | 含义 |
ios_base::basefield | ios_base::dec | 使用基数10 |
ios_base::oct | 使用基数8 | |
ios_base::hex | 使用基数16 | |
ios_base:floatfield | ios_base::fixed | 使用定点计数法,如1234.5 |
ios_base::scientific | 使用科学计数法,如1.2345e4 | |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
ios_base::right | 使用右对齐 | |
ios_base::internal | 符号或基数前缀左对齐,数值右对齐 |
再回到C++ cout.setf(ios_base::fixed,ios_base::floatfiled)
就是说输出使用定点输出,同时输出到小数点后6位。
对于定点计数和科学计数法
- 精度是指小数点后几位数
- 显示末尾的0