我正在尝试编写一个代码,该代码计算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);
此外,关于如何更整齐地获取年龄信息的任何建议都很好,这是最好的方法吗?
答案 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)
这是计算变形数据类型的方式。
当int
与int
一起使用时,结果也仍然是int
。如果结果包含小数部分,则由于类型强制转换为int
而被丢弃。
但是,如果int
使用double
或float
进行操作,则结果将是相应类型的double
或float
。
因此,您需要做的只是将任何操作数转换为十进制类型。例如
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
。如果后缀是字母f
或F
,则浮点常量的类型为float
。]
根据类型提升规则,如果类型a
的{{1}},b
和c
中有任何(或全部)变量,则表达式的结果值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?
数的平均值时,这种方法可能是好的,但是当您编写某个现实世界的应用程序时,以用户年龄作为输入是完全不合适的。另外,您不对用户输入进行任何验证。 3
或10000000
(负值)不是有效的年龄输入。