我几乎不熟悉C编程,而且我一直试图让一个简单的平均函数正确,但答案的小部分一直在搞乱...... ??
#include <stdio.h>
#include <float.h>
float cal(int num1,int num2,int num3);
int main(){
int a,b,c;
float avg;
a=10;
b=5;
c=11;
avg=cal(a,b,c);
printf("Average is : %E\n", avg);
return 0;
}
float cal(int num1,int num2,int num3){
float avg1;
avg1=(num1+num2+num3)/3;
return avg1;
}
答案(avg
)应该是8.66666666667
,而是8.00000000
...
答案 0 :(得分:4)
你在这里进行整数除法。将它强制转换为float
(至少其中一个)或在除法之前使用浮动文字来强制它使用浮动除法。
例如,更改
avg1=(num1+num2+num3)/3;
到
avg1=(num1+num2+num3)/(float)3; // 1. cast one to float
avg1=(num1+num2+num3)/3.0f; // 2. use float literals
答案 1 :(得分:3)
这是因为这里的所有操作数都是整数(num1+num2+num3)/3
。所以你得到一个整数除法,后来被转换为浮点数(即在赋值时,但在评估之后)。
您需要将其中一个除法操作数设为float
,其余部分将被转换。该部门将是float
部门。
E.g:
(num1+num2+num3)/(float)3
(num1+num2+num3)/3.0f
((float)(num1+num2+num3))/3
请注意,由于括号,添加仍然是整数加法。
关于转换规则的一个很好的解读是here
。
答案 2 :(得分:3)
更改此
avg1=(num1+num2+num3)/3;
到这个
avg1=(num1+num2+num3)/(float)3
;
这样你就可以通过浮动来强制划分。
使用您的代码实际执行整数除法,这意味着丢弃十进制数字。然后将除法结果赋给浮点数,但十进制数字已经消失。这就是为什么你需要将除法的至少一个操作数强制转换为浮点数,以获得你想要的东西。
答案 3 :(得分:2)
更改
avg1=(num1+num2+num3)/3;
到
avg1=(float)(num1+num2+num3)/3;
如果执行整数除法,则结果也将是整数。
由于avg1
已经声明为float,您可以转换操作的结果以获取浮点值。
答案 4 :(得分:2)
强制划分以浮点执行
avg1=(num1+num2+num3)/3.0f;
在您的情况下,您执行整数除法,然后将其转换为浮点数:
(num1+num2+num3)/3
的结果类型是整数,而(num1+num2+num3)/3.0f
的类型是浮点数。
整数除法将给出没有小数点的结果。
答案 5 :(得分:0)
您可以进一步简化代码
float cal(int num1,int num2,int num3){
return ((num1+num2+num3)/3.0);
}
只需将值3更改为3.0即可。因为必须手动进行向上转换,所以编译器只执行向下转换。
答案 6 :(得分:0)
除了指出需要使用浮点除法而不是整数除法之外,典型的float
不会提供像8.66666666667
这样的精确数字,而只能提供6个左右的数字。此外,转换为int
时,典型float
(32位)的转换可能会导致截断。
要获得.
权利的11位数字的更准确答案,请使用double
代替float
double cal(int num1,int num2,int num3){
double avg1;
avg1=(num1+num2+num3)/3.0; // 3 --> 3.0
return avg1;
}
int main(void){ // added void
int a,b,c;
double avg;
a=10;
b=5;
c=11;
avg=cal(a,b,c);
// printf("Average is : %E\n", avg);
printf("Average is : %.11E\n", avg); // Print to 11 digits after the dp.
return 0;
}