C++中Float与double的区别

 

简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字(见我的double_float文件)

  还有,有个例子:CC++中,如下赋值语句

float a=0.1;
编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '
原因:
C/C++中(也不知道是不是就在VC++中这样),上述语句等号右边0.1,我们以为它是个float,但是编译器却把它认为是个double因为小数默认是double),所以要报这个warning
通常的做法,经常使用double,而不喜欢使用float

 

还有就是两者都有的不准确性:

有下面程序:
class T{
public static void main(String args[]){
for(float y=0;y!=1.2;y+=0.1){
System.out.println(y);
if(y>1.5) break;
}
}
}
该程序的输出结果如下:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
1.0000001
1.1000001
1.2000002
1.3000002
1.4000002
1.5000002
修改后的程序如下:
class T{
public static void main(String args[]){
for(double y=0;y!=1.2;y+=0.1){
System.out.println(y);
if(y>1.5) break;
}
}
}
修改后程序的输出结果:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
请问:为什么这两个程序循环语句中不能按0.1递增? 

答案参考:

程序产生如此输出结果的原因:floatdouble"不准确"

参考资料如下:
float
类型的变量与零值比较的if语句的写法:
标准答案示例:

const float EPSINON = 0.00001;

if ((x >= - EPSINON) && (x <= EPSINON)

不可将浮点变量用“==”=”与数字比较,应该设法转化成“>=”“<=”此类形式。

 

最后是自己研究float_double的过程一个帖子:

如下两段代码:
  
代码一:

#include <iostream.h>
#include 
int main()
{
    const double PI = 3.14159265358979;
    const float ss = static_cast<float>(PI);
    cout << PI << endl;
    cout << ss << endl
    return 0;
}

运行结果:
3.14159
3.14159

  
代码二:

#include <iostream.h>
#include 
int main()
{
    const double PI = 3.1415926535;
    const float ss = static_cast<float>(PI);
    cout << setprecision( 20 )
         << setiosflags(ios::fixed | ios::showpoint )
         << PI << endl;
    cout << setprecision( 20 )
         << setiosflags(ios::fixed | ios::showpoint ) 
         << ss << endl;
    return 0;
}

运行结果:
3.141592653500000
3.141593

代码三:

#include <iostream.h>
#include 
int main()
{
    const double PI = 3.14159265358979612;
    const float ss = static_cast<float>(PI);
    cout << setprecision( 20 )
         << setiosflags(ios::fixed | ios::showpoint )
         << PI << endl;
    cout << ss << endl;
    return 0;
}

运行结果:
3.141592653589796
3.141593

代码四:

#include <iostream.h>
#include 
int main()
{
    const double PI = 3.14159265358979612;
    const float ss = 3.1415;
    cout << setprecision( 20 )
         << setiosflags(ios::fixed | ios::showpoint )
         << PI << endl;
    cout << ss << endl;
    return 0;
}

运行结果:
3.141592653589796
3.141500

问题过程如下:从一看出VC++默认显示6位有效数字(无论double或者float),从二看出float的有效数位是7位(四个字节有正负嘛),double168个字节);但是,为何代码三中ss仍旧显示7位有效数位,不是VC++默认是6位吗?然后尝试代码四,发现运行结果竟然是这样的,居然“setprecision( 20 )”“setiosflags(ios::fixed | ios::showpoint )”作用到下面的cout了。
  
虽然解决了floatdouble的困惑,但又有了新的问题:为什么“setprecision( 20 )”“setiosflags(ios::fixed | ios::showpoint )”能作用到下面的cout,怎么让它不作用到下面的cout,大家有什么意见?

http://teloon.blog.hexun.com/16906050_d.html

你可能感兴趣的:(C++基本知识,float,c++,ios,编译器,string,class)