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还大,为什么就没问题呢?
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 存储精度的问题~~
计算机存储的是二进制~~~~~
要说起来真的很复杂,自己查查书吧~
确实很怪哦.强制类型转换有误差...