Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
6年前关闭。
请帮助我解决以下程序中的错误。我没有得到小数部分的正确输出。
提前致谢
因为在整个循环中x都不是
当
如您所愿。当输入的数值比一位数字更精确时,这两个差异就是导致结果错误的原因。
最后,这是一些工作代码:
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
6年前关闭。
请帮助我解决以下程序中的错误。我没有得到小数部分的正确输出。
提前致谢
#include<stdio.h>
#include<math.h>
main()
{
int p,i,j,t,x;
float n,sum,d;
printf("enter the binary number");
scanf("%f",&n);
p=(int)n;
d=n-p;
i=0;
while(p>0)
{
t=p%10;
sum=sum+t*pow(2,i);
p=p/10;
i=i+1;
}
i=1;
while(d>0.0)
{
d=d*10;
x=(int)d;
sum=sum+x*pow(2,-i);
d=d-x;
i=i+1;
}
printf("decimal value is %f",sum);
getch();
}
最佳答案
您的问题在于,当您应该使用int并且尚未初始化任何变量时,您正在使用float。将float
更改为int
,并将变量初始化为0
,您的代码即可使用。
您的代码无法正常工作的原因是未初始化sum
。使用sum = sum + t * pow (2, i)
时,将在第一个遍历中向结果添加一个任意数字。 sum
可以是初始化之前的任何内容(即-1241232
)。
即使真正需要初始化的唯一变量是sum
,d
和i
,无论如何都要初始化它们是一个好习惯(安全起见,抱歉。)。实际上,初始化变量是导致错误的常见原因。初始化一切。
在第二个循环中,浮点数据类型也导致您的代码出现问题。当用户输入一个浮点数时,例如110.1101,它近似于另一个数(即110.110098)-这与浮点数据类型的限制有关。
在您的第二个循环中,输入近似为110.1100998,此语句中引起了问题:
sum = sum + x * pow (2.0f, -i);
因为在整个循环中x都不是
1
或0
(有时是9
或8
等)。更重要的是,循环不仅重复4次(1101),而且还重复了很多次。这是因为以下语句:d = d * 10;
当
d
乘以10
时,它从0.100998
变为大约1.00979
-而不是1.00998
如您所愿。当输入的数值比一位数字更精确时,这两个差异就是导致结果错误的原因。
最后,这是一些工作代码:
#include <stdio.h>
#include <math.h>
int main (){
int p = 0, i = 0, j = 0, t = 0, x = 0;
float n = 0.0f, sum = 0.0f, d = 0.0f;
printf("enter the binary number: ");
scanf("%f", &n);
p = n;
d = n - p;
while (p > 0){ // never use the float datatype for iteration
t = p % 10;
sum = sum + t * pow (2.0f,i);
p = p / 10;
i = i + 1;
}
i = 1;
while (d > 0.00001){
d = d * 10;
x = d;
sum = sum + x * pow (2.0f, -i);
d = d - x;
i = i + 1;
}
printf ("decimal value is %f\n", sum);
getchar ();
return 0;
}
关于c - 用于二进制到十进制转换的C程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17765865/