#include <stdio.h>
int main(void)
{
float c =8/5;
printf("The Result: %f", c);
return 0;
}
答案是1.000000
。为什么不是1.600000
?为什么我的浮球会被截断?
#include <stdio.h>
int main(void)
{
float c =8/5;
printf("The Result: %f", c);
return 0;
}
答案是1.000000
。为什么不是1.600000
?为什么我的浮球会被截断?
C正在将您的8/5
输入解释为整数。用整数,C将其截短为1.
将代码更改为8.0/5.0
。这样它就知道你正在处理实际的数字,它会存储你正在寻找的结果。
只是为了澄清:编译器**必须**将表达式“解释”为整数,因为常量是整数。更确切地说,他们有'int'类型。 – Olaf
表达
8/5
是全int
表达。因此,它的计算结果为(int)1
自动转换为float
发生在赋值中。
如果转换的鸿沟面前飘起,你会得到你所寻求的答案:
(float)8/5
或只是
8.0/5
当你没有指定你用什么数据类型(例如,在您的代码中,您使用整数常量8
和5
)C使用最小的合理类型。在你的情况下,它分配了整数类型8
和5
,并且因为除法表达式的两个操作数都是整数,所以C产生了一个整数结果。整数没有小数点或小数部分,所以C会截断结果。这会抛弃剩下的除法操作,留下1而不是1.6。
即使您将结果存储在浮点型中,也会发生这种情况。这是因为表达式是使用整数类型来计算的,所以结果按原样存储。
有解决这一问题的至少两种方法:
角色表达式的一部分为双型或其它类型的能够存储小数部分:
这里8
浇铸到double
类型,所以C将用操作数进行浮点除法。请注意,如果您投了(8/5)
,则会在投射前进行整数除法。
foo = (double) 8/5
使用双作为一个操作数:
foo = 8.0/5
C不做底板划分;在C99之前,它要么是平面的,要么是向零截断,在C99中定义了实现,然后它严格截断为零,而不是平面。对于积极的结果它是一样的(都向下舍入),但是对于负面结果,分区舍入向下舍入,向零舍入。 – ShadowRanger
@ShadowRanger很高兴知道,我将编辑它。 – brandaemon
在第一个例子中说你正在投射表达式,这有点令人误解。演员操作员优先于分区,所以你实际上将8投入浮动。如果你写了'(float)(8/5)',你仍然会得到1. – zneak
有没有涉及类型转换。改变标题是一个好主意。 – Olaf
@ShadowRanger:我不同意;虽然这个问题被严重研究,但它不是关于整数和舍入浮点除法之间的区别,而是为什么整数除法不会产生浮点结果。 – Olaf
尽管标题现在好一些,但你似乎已经错过了'8/5'这个点不是**浮点数(表格),而是一个整数。没有一个操作数是浮点值。 – Olaf