爱简单bilibili:c++问题:结果为什么是这样?

来源:百度文库 编辑:高考问答 时间:2024/05/06 04:42:13
我写了一个计算小数点后位数的程序.但是结果却不正确.
代码如下:
#include<iostream.h>
void main(void)
{
int i;double a=0.6502;
for(i=0; a!=0; i++)
{
a=a*10-int(a*10);
cout<<a<<endl;
}
}
运行结果:
0.502
0.02
0.2
1
1
1
1
1
1
1
0.999998
0.999978
0.99978
0.997797
0.977973
0.779732
0.797318
0.973175
0.731752
0.317519
0.175191
0.751914
0.519144
0.191437
0.914369
0.143689
0.436894
0.368942
0.689424
0.894238
0.94238
0.4238
0.237995
0.379951
0.799515
0.995148
0.951477
0.514771
0.147705
0.477051
0.770508
0.705078
0.0507813
0.507813
0.078125
0.78125
0.8125
0.125
0.25
0.5
0
为什么会出现这样的结果?请帮忙修改.
我在调试时发现:

在赋值时结果是:0.65020000000000000
在运行a=a*10-int(a*10);时结果是:0.50199999999999978
请问怎么解决这个问题?

我的目的是计算出小数点后的位数.如果哪位有好的计算方法请告诉我.谢谢.

double型的数据和0比较一般不用a==0或者a!=0 而是使用 fabs(a) < 某数值(如1e-6) 这是因为double型本身运算就是非精确的, 可能计算出结果为0的时候实际上结果只是一个非常小的数字,但是却不是0.
可以把程序改为:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int i;
double a = 0.6502;
for(i = 0;;i++)
{
a = a * 10 - int(a * 10);
if (fabs(a) < 1e-6)
break;
cout<<a<<endl;
}
}

你的a是double型的,double型的书是不能和int型的0比较的(a!=0),建议你把double型的数转化为string类,再来计算位数,希望有更好的答案

#include<iostream.h>
void main(void)
{
int i;double a=0.6502;
for(i=0; int(a)!=int(a-0.5); i++)
{
a=a*10;
cout<<a<<endl;
}
}
你看这么判断行不??