鉴于这部分比较重要,还是单独写吧
前言:
我真的哭死,我应该在c++入门的时候就去看这个的
每次在保留小数的时候我都是用的c的printf的格式控制符,这虽然偷懒又方便但是在某些情况下是无用的甚至会很搞心态
比如使整数保留n宽度,这种方法完全没用
简单介绍一下下面几种函数
setprecision(有效数位) 及fixed的数位输出模式转换
这种方式输出会四舍五入
c++和c在这里不同
c是默认保留小数点后六位
而c++是默认保留6位有效数,而默认情况下setprecision是控制数的有效位数
c++也可以用fixed转换成c的模式
这个时候setprecision(n)就是控制小数点后多少位了,看到这里,着实感到c++功能多
只是自己没学到罢了
fixed的移除
我目前看到的最简单的是这样用的(奇奇怪怪比较难记,不得了再翻)
cout.unsetf( ios::fixed );
//还有一个cout.unsetf( ios::floatfield);
//这里对今天的学习影响不大,就不讨论了
setw(数的宽度)//默认右对齐
Cao 太多了 左右对齐和showpoint很有用
明天(02.10)出一个代替c的标准准输入输出的c++版本
和格式控制符有异曲同工之妙 超过宽度控制无效
setfill(‘@’)(一般与setw连用)
这个用来填充setw中的空格部分,默认为空格
现在可以完全代替c的格式控制符的printf了,但是c还是直观一些
setbase(int n进制)
将后面输出的数转化为n(8/10/16)进制输出,可与setw连用(setprecision暂时没试过,一般也不会考小数的进制转换吧)
showpoint(取消了 默认的末尾0自动取消这一特性)
一般来说fixed+precision就能解决保留小数点的问题,这里不细讲,平时我也不会在怎么去用这个
要是发现了什么新特性再嗦
正文部分
(1)保留小数(setprecision(int n))(可以为变量或常量)
这是我最开始写的 :
这个说法并不是很对,应该是保留有效数位,
暂时还没找到保留小数后多少位,暂时用printf的格式控制符凑合吧
其实setprecision在不同的fixed的设置下会有两种小数输出方式
函数: setprecision( )
位数参数写在括号里面比如我们要保留变量至3位有效数位至3位
ps:未fixed末尾不会有多余的0哦!(不足四舍五入)
代码:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double a, b;
cin >> a >> b ;
cout << setprecision(3) << a/b << endl;
return 0;
}
有多余0情况
不足(这里改成保留2位小数)
直接去尾
不过保留n为小数解决了 现在不知道怎么解决是整数占n位……(下面已解决)
看了下日期,相隔甚久……
又一个很奇怪且致命的问题:有时候setprecision不会四舍五入!!!暂时还不知道为什么
救命,居然没有四舍五入
为什么这个又可以了
(2)占位函数stew(int n)(可以为变量或常量)
姑且这么说吧(左对齐先放一边慢慢来)
哭死,期末考试就考了将整数保留n宽度,最后几分钟程序敲出来了硬是格式错误
while(n--)
{
cout<<"数字 & 宽度"<<endl;
cin>>num>>m;
cout<<setw(m)<<num<<endl;
}
效果:
(3)后面数字进制转换(setbase(8))//将后面的数转化成八进制(可以为变量或常量)
只能是8 10 16这三个数字 其他数字会使得该setbase无效(不过10好像和无效 是一个效果)
如参数为11的情况:
参数为8的情况:
(4)setfill(‘@’)
#include <iostream>
#include <iomanip>
#include<cstdio>
using namespace std;
int main()
{
long m,n;
double b,a;
int t,num=16;
cout<<"m 位"<<endl;
cin>>m>>n;
cout<<setfill('@')<<setw(n)<<m<<endl;
//cout.unsetf( ios::fixed );
return 0;
}