简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字(见我的double_float文件)
还有,有个例子:在C和C++中,如下赋值语句
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递增?
答案参考:
程序产生如此输出结果的原因:float和double是"不准确"值
参考资料如下:
float类型的变量与零值比较的if语句的写法:
标准答案示例:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
最后是自己研究float_double的过程一个帖子:
如下两段代码:
代码一:
#include <iostream.h>
#include <iomanip.h>
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 <iomanip.h>
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 <iomanip.h>
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 <iomanip.h>
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位(四个字节有正负嘛),double是16(8个字节);但是,为何代码三中ss仍旧显示7位有效数位,不是VC++默认是6位吗?然后尝试代码四,发现运行结果竟然是这样的,居然“setprecision( 20 )”和“setiosflags(ios::fixed | ios::showpoint )”作用到下面的cout了。
虽然解决了float和double的困惑,但又有了新的问题:为什么“setprecision( 20 )”和“setiosflags(ios::fixed | ios::showpoint )”能作用到下面的cout,怎么让它不作用到下面的cout,大家有什么意见?