平均功能的错误答案?

时间:2014-10-24 14:38:52

标签: c function variables integer-division

我几乎不熟悉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 ...

7 个答案:

答案 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;
}