设置浮点数的显示精度&precision(0)

/*
    设置浮点数的显示精度
    cout.precision(int)可以设置浮点数的显示精度(不包括小数点)
   
    注:

        1.如果设置的精度大于浮点数的位数,如果浮点数能根据IEEE754精确表示,则补零;如果浮点数不能精确表示,则尽量接近
        2.如果设置的精度小于浮点数的位数,采用科学计数法表示
        3.precision(int)单独使用,表示设置有效位数;与fixed或者scientific连用,表示设置小数位的精度
        4.precision(int)会一直生效
        5.float浮点数默认有效位数为6位,不包括小数点,即默认设置有setprecision(6),此默认设置还包含双精度浮点数
        6.precision(0)的问题:
        在VS中,
        如果precision(0)直接使用,则等同于设置默认有效位数,即precision(6);
        如果与fixed连用,则都表示设置小数点后的精度为0,即没有小数位;
        如果与scientific连用,则等同于设置默认有效位数,即precision(6),即表示设置小数点后的精度为6
        综上,在VS中设置精度为0时,存在默认精度6和设置精度0的显隐性问题,只有当与fixec连用,设置精度0才会显示出来;其他情况下,
    显示的都是默认精度6
        
        在dev中设置精度0时,存在设置精度1和设置精度0的显隐性问题,当与fixed或者scientific连用,设置精度0显性;其他情况下,设置
    精度1显性
*/

 

//基本例子
#include <iostream>
using namespace std;
int main()
{
    float p1=3.1415926f;
    float p2=1234.56789f;
    cout<<p1<<endl;         //3.14159
    cout<<p2<<endl;         //1234.57
    cout.precision(13);
    cout<<p1<<endl;         //3.141592502594
    cout<<p2<<endl;         //1234.567871094
    cout.precision(3);
    cout<<p1<<endl;         //3.14
    cout<<p2<<endl;         //1.23e+003

    return 0;
}
//VS中precision(0)的情形,存在precision(0)与precision(6)的显隐性问题。只有当与fixed连用时,precision(0)才为显性 
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    float y=3.460f;
    cout.precision(0);
    cout<<y<<endl;                                        //3.46,precision(6)显性
    cout<<scientific<<y<<endl;                            //3.460000e+000,precision(6)显性
    cout<<resetiosflags(ios::floatfield)<<y<<endl;        //3.46,precision(6)显性
    cout<<fixed<<y<<endl;                                 //3,precision(0)显性
    cout<<resetiosflags(ios::floatfield)<<y<<endl;        //3.46,precision(6)显性

    cout<<endl;
    float z=0.3460f;
    cout.precision(0);
    cout<<z<<endl;                                        //0.346,precision(6)显性
    cout<<scientific<<z<<endl;                            //3.460000e-001,precision(6)显性
    cout<<resetiosflags(ios::floatfield)<<z<<endl;        //0.346,precision(6)显性
    cout<<fixed<<z<<endl;                                 //0,precision(0)显性
    cout<<resetiosflags(ios::floatfield)<<z<<endl;        //0.346,precision(6)显性

    system("pause");
    return 0;
}
//precision(0)在dev中的情形,存在precision(0)与precision(1)的显隐性问题。当与fixed或scientific连用时,precision(0)为显性 
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    float y=3.460f;
    cout.precision(0);
    cout<<"y:"<<y<<endl;                                     //3,precision(1)显性,即有效位数为1 
    cout<<"y:"<<scientific<<y<<endl;                         //3e+000,precision(0)显性,即小数点后的位数为0 
    cout<<"y:"<<resetiosflags(ios::floatfield)<<y<<endl;     //3,precision(1)显性,即有效位数为1 
    cout<<"y:"<<fixed<<y<<endl;                              //3,precision(0)显性,即小数点后的位数为0 
    cout<<"y:"<<resetiosflags(ios::floatfield)<<y<<endl;     //3,precision(1)显性,即有效位数为1 
    
    cout<<endl;
    float z=0.3460f;
    cout.precision(0);
    cout<<z<<endl;                                            //0.3,precision(1)显性,即有效位数为1 
    cout<<scientific<<z<<endl;                                //3e-001,precision(0)显性,即小数点后的位数为0  
    cout<<resetiosflags(ios::floatfield)<<z<<endl;            //0.3,precision(1)显性,即有效位数为1 
    cout<<fixed<<z<<endl;                                     //0,precision(0)显性,即小数点后的位数为0 
    cout<<resetiosflags(ios::floatfield)<<z<<endl;            //0.3,precision(1)显性,即有效位数为1 
    return 0; 
}
posted @ 2015-05-10 11:55  codeplayplus  阅读(3497)  评论(0编辑  收藏  举报