C++高手解决这个奇怪的现象,在线等!!!

来源:百度知道 编辑:UC知道 时间:2024/05/27 12:22:22
#include <iostream.h>
void main()
{
double a=8888.88;
cout<<"a="<<a<<endl;
cout<<"a*100="<<a*100<<endl;
a=(int)(a*100);
cout<<"(int)(a*100)="<<a<<endl;
cout<<endl;
double b=8888.89;
cout<<"b="<<b<<endl;
cout<<"b*100="<<b*100<<endl;
b=(int)(b*100);
cout<<"(int)(b*100)="<<b<<endl;
}

问题:为什么(int)(a*100)的末尾减了1,(int)(b*100)不减?
我试过凡是末尾是8的,都会减1,不是8的就不会。
怎么回事?
3楼说的稍微明白一点,但是针对这道题的话,怎么解释呢?8888。89比8888,88还大,为什么就没问题呢?

double 数据类型由 64 位构成,1 位标志位、11 位指数位、其余 52 位用来表示数字,范围是 +/–1.7E308 精度至少为 15 位。

不过,要了解 double 的范围大小也可以写程序搞定了,比如:

// DoubleRange.cpp 2004-04-10 WGF Wuhan
#include<iostream>
#include<limits>

using namespace std;

int main()
{
cout << "double range: " << numeric_limits<double>::min()
<< " " << numeric_limits<double>::max() << endl;

return 0;
}

输出结果为:

double range: 2.22507e-308 1.79769e+308

所以,double 类型是不精确的,在进行大小判断时,不能把它与某个确切的值进行比较,而是应该给个范围

关于楼主的补充问题,已经发消息了。

double 存储精度的问题~~

计算机存储的是二进制~~~~~

要说起来真的很复杂,自己查查书吧~

确实很怪哦.强制类型转换有误差...