关于C++求小数部分各个位数字问题。

例如 我定义float h=0.46579;
for(i=0;i<10;i++)
{ n=h*10/1; //n是小数部分第一个数
h=h*10-n; //减掉第一个数,h变为0.6579,再用循环
}
但是 我设置了n的输出 结果是4 6 5 7 8 9 9 9 9
如果h=3.784 结果为7 8 3 9 9 9 9
为什么最后哪个数字就会这样。
求高手简明回答 因为是c++初学, 约等于什么后不会,最好是c语言。
谢了
多谢大家指点 获益匪浅。 但这C题目是做个类似计算器的东西
就是可以吧十进制 二进制 16进制之间可以相互转换
10进制到2进制 16进制都可以
但二进制小数怎么到10进制。。。真想不出来了 我就想把二进制整数,小数分开,分别转成10进制,再加起来。
不知道怎么把二进制数转换成字符类,因为有小数点。

如楼上而言,有些符点数在计算机中是存储不了精确的数值的。
想准确输出可采用如下办法:
int i,n;
float h=0.46579;
h = h+ 0.000005 ; //在小数点后的第N(5)位后进行四舍五入
for(i=0;i<5;i++) //小数有多少,就循环多少次,不然,其后的数据又不准确了
{
n=h*10; //n是整型,因此,结果会强制转换成整数,不用/1,没有意义
h=h*10-n; //减掉第一个数,h变为0.6579,再用循环
printf("%d\n" , n );
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-10
这个问题好啊,新手都可能会碰到,它不是C语言或某语言的问题,只是基本数据类型浮点数在计算机中的表示和存储的不理解,引起的,因为存储时是二进制方式,小数部分只以精确的表示
1/2 1/4 1/8 1/16 ... 以及这些数的组合
也就是说,0.5 0.25 0.125 0.0625 ... 这些基本的数是可以精确表示的,由这些数中两个或多个相加得到的和也可以精确表示,如0.75(0.5+0.25) 0.625(0.5+0.125)
又由于有效数字问题,计算机表示的是有限的位数,所以不是所有的浮点数都能精确表达
当对非精确的近似值,乘以10就会把误差一步步放大,而有些数(指精确无误的)就不会,当上面的h=1.625时,就没有那个后面的9了,得到的是 6 2 5 0 0 0 0 0 0 0
所以楼上说小数不能精确表示也不全对。
你用的方法确实是理论上就错了,确实需要用到4舍5入的,且要知道输出的位数,才能正确的得到结果。
我也给点例子:
double h = 0.46579;
__int64 L = (__int64)(h*1000000000000000LL + 0.5); //最后进行四舍五入
while(L>0 && L%10==0) L = L/10;//去掉尾部的0
printf("%I64d\n",L);
这个方法最多也只能确定到小数点后15位,如果是4.6579e-20 那上面方法就得不到了,前面有多少个0,也是可以有办法知道的,这时就不说了本回答被提问者采纳
第2个回答  2012-03-10
计算机表示小数都是近似表示的,所谓的0.1是根本不可能精确表示的,无论你使用多少位二进制都是一样的。所以你使用的方法在理论上就已经错误了。

关于C++求小数部分各个位数字问题。
for(i=0;i<5;i++) \/\/小数有多少,就循环多少次,不然,其后的数据又不准确了 { n=h*10; \/\/n是整型,因此,结果会强制转换成整数,不用\/1,没有意义 h=h*10-n; \/\/减掉第一个数,h变为0.6579,再用循环 printf("%d\\n" , n );} ...

C++小数点后保留几位小数?
double 型 用 %.2lf 就是小数2位, %.1lf 就是小数1位。

C++ 求出分数 a\/b 化为小数的前 50 位数字,末位数字无需四舍五入
void main(void){ int a,b,i;cout << "Enter an integer a & b(a> a >> b;cout << "0.";for(i=0;i<50;i++){ cout << a*10\/b;a=a*10%b;} cout << endl;}

c++中,如何取小数点后的前10位
b=a-a%(10e(-10))这样的话,b就是小数点的前10位了 就是用原来的数字a减去a小数点10位以后的数字,就行了```

关于C++小数输出的问题
20\/8=2.5 两个数默认都是int类型 所以结果是2 然后再将结果转换成float类型他也是2 你看你前几个 不论是float(20)还是(float)20都是将数字转换为浮点型进行运算的,所以结果也是浮点型,而本身20默认为int类型,所以你第一个和最后一个20和8都是以int类型进行计算的,最后一个的计算顺序是先算...

[C++]关于显示小数部分的问题
具有很高的不确定信,一个double类型的值变成int类型的值——两个长度都不一样。推荐是使用字符串来保存这样的数字 char num[100];cin>>num;int j;for(int i=0;num[i];i++)if(num[i]=='.'){j=i;break;} cout<<"这个数的小数部分是:";for(int end=j+1;num[i];end++)cout<<...

有关C++小数输出?
这是因为默认的输出是保留6位有效数字。如果你要以n位小数输出,可以这样:1 include<iomanip> 2 int n=8;double d=1.12345678912;\/\/设置成以n位小数输出 cout<<fixed<<setprecision(n);cout<<d<<endl;如:

c++小数点的问题
int val=123456;cout<<val<<"."<<endl;这样难道不是更方便?那样也可以 不过麻烦一点儿 需要调用几个函数 你看一下吧 float a=123456.f;cout.setf(ios_base::showpoint);cout.precision(6);cout<<a<<endl;需要说一下 C++默认带小数点儿的输入是double型 所以要赋值给一个flaot型应该在数字...

c++小数计算后数字变化
就知道的啦 我简单说一下 浮点数 存储的 时候 是先 把 这个 数 转化成 二进制浮点数 , 然后 再用 科学计数法 表示 而 十进制 转化 为 二进制时, 很多数 不能 正好 转化为 与之 相等 的 数,只能 用 其 近似值 表示, 因此 产生 了 误差 在 计算机 学 里, 这就是 精度 问题 ...

c++问题,传入double类型值,获取小数点前后的位数。急。 在线等。 代码...
printf("%.15lf",a); --- 可以输出小数点后15位,就算不指定 printf("%lf",a); ---也有默认小数点后6位输出 你用那cout 和 << 输出实型数,不特别指定格式时,就是默认7位有效数字.对于cout,你会去研究它的特别格式吗?多数人都忽略它们了,我也忽略它的,即使是用C++ 我依旧爱用...

相似回答