关于#c语言#的问题:大一c语言:求解答:1.平均捐款额应该是48.666667,请问为什么这个程序输出的是48.666668

大一c语言:

img

求解答:1.平均捐款额应该是48.666667,请问为什么这个程序输出的是48.666668?
2.请问有什么方法能输出48.666666?

下面是我写的程序

#include <stdio.h>
void main()
{
    int i,j,t,p=0;
    int a[15];
    float b,s=0;
    printf("输入单人捐款额:");
    for(i=0;i<15;i++)
    {
    scanf("%d",&a[i]);
    if(a[i]>0) p++;
    }
    for(i=0;i<15;i++)
    s=s+a[i];
    b=s/15;
    for(i=0;i<14;i++)
    for(j=i+1;j<15;j++)
    if(a[i]<a[j])
    {
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
    printf("有%d个人捐款了\n",p);
    printf("捐款人平均的捐款额为:%f\n",b);
    printf("将捐款额从大到小排序依次为:");
    for(i=0;i<15;i++)
    printf("%d ",a[i]);
    printf("\n");
}

浮点数存在精度误差,这是很正常的现象,你可以用double,再四舍五入

正常,你可以尝试了解一下计算机是如何表示小数点后面的数,这个在计算机组成原理里有详细描述

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7591761
  • 你也可以参考下这篇文章:【C语言】用指针的方法处理:输入十个整数,将其中最小的数与第一个数交换,将最大数和最后一个数交换
  • 除此之外, 这篇博客: C语言程序设计第四版课后习题-谭浩强中的 7.16写一函数,输入一个十六进制数,输出相应的十进制数。 (各种进制转换) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • /*7.16写一函数,输入一个十六进制数,输出相应的十进制数。*/
    int hexToDec(char arr[]){
    	int i,len,c,res=0;
    	len=strlen(arr)-1;
    	for(i=len;i>=0;i--){
    		c=arr[i];
    		if(c>'9'){
    			c=10+c-'A';
    		}else{
    			c=c-'0';
    		}
    		res+=c*pow(16,len-i);
    	}
    	return res;
    }
    /*10进制转十六*/
    void DecToHex(int n){
    	char arr[n];
    	int t,i=0;
    	while(n>0){
    		t=n%16;
    		if(t>9){
    			arr[i]='A'+t%10;
    		}else{
    			arr[i]='0'+t;
    		}
    		i++;
    		n=n/16;
    	}
    	i--;
    	for(;i>=0;i--){
    		printf("%c",arr[i]);
    	}
    }
    int main(){
    	char arr[100];
    	int t;
    	printf("请输入一个16进制:");
    	scanf("%[^\n]",arr);
    	t=hexToDec(arr);
    	printf("%s的十进制为%d\n16进制为:",arr,t);
    	DecToHex(t);
    	printf("end\n");
    	return 0;
    }
    /*二进制转10进制*/
    int binary2Decimal(long n){
    	int res=0,i=0,oz=0;
    	while(n>0){
    		oz=n%10;
    		res=res+oz*pow(2,i++);
    		n=n/10;
    		printf("n为%d\n",n);
    	}
    	return res;
    }
    /*十进制转二进制*/
    long long decimal2Bin(int n){
    	int res=0,i=1,oz=0;
    	while(n>0){
    		oz=n%2;
    		res+=oz*pow(10,i);
    		i++;
    		n=n/2;
    	}
    	return res;
    }
    /*八进制转十进制*/
    int octal2decimal(long long n){
    	int res=0,i=0,oz=0;
    	while(n>0){
    		oz=n%10;
    		res+=oz*pow(8,i);
    		i++;
    		n=n/10;
    	}
    	return res;
    }
    /*十进制转八进制*/
    long long decimal2octal(int n){
    	int res=0,i=1,oz=0;
    	while(n>0){
    		oz=n%8;
    		res+=pow(10,i)*oz;
    		n=n/8;
    		i++;
    	}
    	return res;
    }
    /*八进制转二进制*/
    long long octal2bin(long long n){
    	int res=0,i=0,oz=0;
    	/*八转十*/
    	while(n>0){
    		oz=n%10;
    		res+=oz*pow(8,i);
    		n=n/10;
    		i++;
    	}
    	n=res;
    	res=0,i=1,oz=0;
    	/*十转二*/
    	while(n>0){
    		oz=n%2;
    		res+=oz*pow(10,i);
    		n=n/2;
    		i++;
    	}
    	return res;
    }
    /*二进制转八进制*/
    long long bin2octal(long long n){
    	int res=0,i=0,oz=0;
    	/*二转十*/
    	while(n>0){
    		oz=n%10;
    		res+=oz*pow(2,i);
    		i++;
    		n=n/10;
    	}
    	n=res;
    	res=0,i=1,oz=0;
    	/*十转八*/
    	while(n>0){
    		oz=n%8;
    		res+=oz*pow(10,i);
    		i++;
    		n=n/8;
    	}
    	return res;
    }
    
  • 您还可以看一下 陈立臣老师的C语言陪跑训练营课程中的 1.3 生产一个程序的过程是什么样 小节, 巩固相关知识点