2016-01-30 45 views
0
#include <stdio.h> 

int main(void) 
{ 
    float c =8/5; 
    printf("The Result: %f", c); 
    return 0; 
} 

答案是1.000000。为什么不是1.600000为什么我的浮球会被截断?

+1

有没有涉及类型转换。改变标题是一个好主意。 – Olaf

+0

@ShadowRanger:我不同意;虽然这个问题被严重研究,但它不是关于整数和舍入浮点除法之间的区别,而是为什么整数除法不会产生浮点结果。 – Olaf

+0

尽管标题现在好一些,但你似乎已经错过了'8/5'这个点不是**浮点数(表格),而是一个整数。没有一个操作数是浮点值。 – Olaf

回答

2

C正在将您的8/5输入解释为整数。用整数,C将其截短为1.

将代码更改为8.0/5.0。这样它就知道你正在处理实际的数字,它会存储你正在寻找的结果。

+0

只是为了澄清:编译器**必须**将表达式“解释”为整数,因为常量是整数。更确切地说,他们有'int'类型。 – Olaf

1

表达

8/5 

是全int表达。因此,它的计算结果为(int)1

自动转换为float发生在赋值中。

如果转换的鸿沟面前飘起,你会得到你所寻求的答案:

(float)8/5 

或只是

8.0/5 
0

当你没有指定你用什么数据类型(例如,在您的代码中,您使用整数常量85)C使用最小的合理类型。在你的情况下,它分配了整数类型85,并且因为除法表达式的两个操作数都是整数,所以C产生了一个整数结果。整数没有小数点或小数部分,所以C会截断结果。这会抛弃剩下的除法操作,留下1而不是1.6。

即使您将结果存储在浮点型中,也会发生这种情况。这是因为表达式是使用整数类型来计算的,所以结果按原样存储。

有解决这一问题的至少两种方法:

角色表达式的一部分为双型或其它类型的能够存储小数部分:

这里8浇铸到double类型,所以C将用操作数进行浮点除法。请注意,如果您投了(8/5),则会在投射前进行整数除法。

foo = (double) 8/5 

使用双作为一个操作数:

foo = 8.0/5 
+1

C不做底板划分;在C99之前,它要么是平面的,要么是向零截断,在C99中定义了实现,然后它严格截断为零,而不是平面。对于积极的结果它是一样的(都向下舍入),但是对于负面结果,分区舍入向下舍入,向零舍入。 – ShadowRanger

+0

@ShadowRanger很高兴知道,我将编辑它。 – brandaemon

+1

在第一个例子中说你正在投射表达式,这有点令人误解。演员操作员优先于分区,所以你实际上将8投入浮动。如果你写了'(float)(8/5)',你仍然会得到1. – zneak

相关问题