为什么我的程序输出的是整数而不是浮点数?

时间:2018-12-28 03:14:27

标签: c

我正在尝试编写一个代码,该代码计算3个人的平均年龄,输入是年龄(整数),输出是平均值(浮动)。

但是每个输出总是四舍五入为整数而不是浮点数。我正在使用C。

int a, b, c;
float average;

printf("Enter your ages:\n");
scanf("%d %d %d", &a, &b, &c);

average = (a + b + c)/3;
printf("\n The average age of ABC is %f", average);

此外,关于如何更整齐地获取年龄信息的任何建议都很好,这是最好的方法吗?

3 个答案:

答案 0 :(得分:7)

  

但是每个输出总是四舍五入为整数而不是浮点数

您需要的是这个

 float average = (a + b + c)/3.0f;

请注意,您需要3.0f才能将计算强制为浮点数。否则,它只会将其仅视为整数(因为所有a,b,c都是整数)。

您可以删除average的初始声明,而是声明它并在与上述相同的时间对其进行初始化。

@Patrick指出,后缀f很有用,因为如果没有后缀,则计算默认为double而不是float,并且当发生分配。

  

此外,关于如何更整齐地获取年龄信息的任何建议都很好,这是最好的方法吗?

scanf("%d %d %d", &a, &b, &c);

不确定是否有最佳方法。但是,scanf看起来可以输入。

答案 1 :(得分:2)

这是计算变形数据类型的方式。

intint一起使用时,结果也仍然是int。如果结果包含小数部分,则由于类型强制转换为int而被丢弃。

但是,如果int使用doublefloat进行操作,则结果将是相应类型的doublefloat

因此,您需要做的只是将任何操作数转换为十进制类型。例如

average = (a + b + c) / 3.0;

average = (float) (a + b + c) / 3;

都可以。

答案 2 :(得分:2)

>>>> ...the input being the ages (integers), and the output being the average (float)...

看一下表达式:

average = (a + b + c)/3;
   |      |_________| |
 float        int    integer constant

表达式的右侧均为int,因此该表达式的输出将为int类型,而不是float。该表达式最终将int的值分配给float类型的变量。

要解决此问题,您应该了解隐式类型升级和转换规则。来自Default type promotions and conversions

  

如果一个操作涉及两个操作数,并且其中一个操作数为float类型,则另一个操作数将转换为float。

[此规则上方的规则很少,并且仅在那些规则不适用时适用]

因此,在表达式(a + b + c)/3中,如果将integer constant更改为float constant,则整个表达式的结果将为float类型。

average = (a + b + c)/3.0f;

[不带后缀的浮点常量的类型为double。如果后缀是字母fF,则浮点常量的类型为float。]

根据类型提升规则,如果类型a的{​​{1}},bc中有任何(或全部)变量,则表达式的结果值float的类型为integer constant

例如:

float

您也可以使用强制类型转换来解决问题。但是这样做也不要忘记类型转换规则。

例如,您可以在表达式中

float a, b, c;

Or

int a, b;
float c;  // Of course you don't want to do this because in your example a, b and c
          // represents same thing and you want all of them to be of same type. 
          // This is just for the understanding.

average = (a + b + c)/3;
          |____________|
                 |
          The result of this will be of type float because at least one among a, b and c is 
          of type float and by the type promotion rule other will be promoted to float and 
          (a + b + c) will be calculated as all float type.

这样,表达式的结果值将为either this average = (float)(a + b + c)/3; or this average = (a + b + c)/(float)3; 类型,因为float运算符之一的操作数的类型为/。但是,如果您这样做:

float

您将无法获得理想的结果,因为将计算表达式average = (float)((a + b + c)/3); 并将全部(a + b + c)/3并且产生的结果将是int类型,并且键入没有任何意义在表达式计算后强制转换。

int

我认为这不是最好的方法,因为用户无法给出确切的年龄年/月/日(似乎您仅以年为输入)。对于此类示例,在计算>>>> Also, any advice on how to more neatly get the age inputs would be nice, is this the best way to do it?数的平均值时,这种方法可能是好的,但是当您编写某个现实世界的应用程序时,以用户年龄作为输入是完全不合适的。另外,您不对用户输入进行任何验证。 310000000(负值)不是有效的年龄输入。