求教double型数据比较精度的问题?
int main()
{
cout << "输入两个数" << endl;
double a=0,b=0,minum,maxum;
while(cin>>a>>b)
{
double cha=a-b;
if(cha==0)
cout<<"两者相等"<<"\n";
else
{
if(cha>0)
maxum=a,minum=b;
else
maxum=b,minum=a;
if(cha<0.1&&cha>-0.1)
cout<<"两者近似, 差值为"<<cha<<"\n";
cout<<"最大值"<<maxum<<"\n"
<<"最小值"<<minum<<"\n"
<<"差值"<<cha<<"\n";
};
};
return 0;
}
很奇怪,测试1.1 1.2会说两者近似,大部分不会,差值都是0.1,求教,那编错了吗?
[解决办法]
任何不等于0.5的N次方的整数倍的小数都不能用浮点数精确表示,只能近似表示
我没仔细算,只举个例子:如果0.1在内存中用0.99999999近似表示,0.2在内存中用0.20000001近似表示,那么在楼主的程序中,它们就不近似;相反,如果0.1在内存中用0.10000001近似表示,0.2在内存中用0.19999999近似表示,那么在楼主的程序中,它们就近似
关键就一句话,别比较浮点数的精确相等。在数学中0.2-0.1=0.1,在浮点数中这个等号就未必成立——除非参与运算的三个数数量级相近,并且都恰好是0.5的N次方的整数倍,才有可能成立
[解决办法]
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。