Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? 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)。

即使真正需要初始化的唯一变量是sumdi,无论如何都要初始化它们是一个好习惯(安全起见,抱歉。)。实际上,初始化变量是导致错误的常见原因。初始化一切。

在第二个循环中,浮点数据类型也导致您的代码出现问题。当用户输入一个浮点数时,例如110.1101,它近似于另一个数(即110.110098)-这与浮点数据类型的限制有关。
在您的第二个循环中,输入近似为110.1100998,此语句中引起了问题:

sum = sum + x * pow (2.0f, -i);


因为在整个循环中x都不是10(有时是98等)。更重要的是,循环不仅重复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/

10-11 23:10
查看更多