为什么在C中,当我用%f打印一个双精度型变量时,它显示8.000000…,但这不是期望的结果。我想要类似8.5000的结果,如何实现呢?
int main(){
int i, j;
double k;
i=8; j=9;
k = (i+j)/2;
printf("%f", k);
}
答案 0 :(得分:1)
问题不在于格式说明符,而在于算术运算。
说
k = (i+j)/2;
其中i
和j
和2
-都是int
,您要进行整数除法,然后将结果存储在{{1 }}。对于整数除法,
[..]整数相除时,
double
运算符的结果是代数商,其中任何小数部分都被舍弃[...]
,通常称为“向零截断”。为了避免这种情况的发生,您需要通过强制或强制将其中一个操作数强制转换为/
(或double
)来强制执行浮点运算。像
float
或
k = ((double)i+j)/2;
这里的意思是,如果在操作中,其中一个操作数的等级更高({k = (i+j)/2.0; //2.0 is of type double
或double
的等级高于float
),则所有操作数将首先将其转换为较高的等级,然后执行操作,结果将为较高等级的类型。
答案 1 :(得分:0)
由于i和j为int
,因此结果首先转换为int
。这降低了精度。显式转换为双k = (double)(i+j)/2
答案 2 :(得分:0)
评论是正确的。为了更好地理解这一点:C表达式以“一个块”计算。您的作业(i+j)/2
的右侧是一个完整的表达式。由于它仅包含整数值,因此所选的算术也将是整数类型(这会导致结果被截断),从而创建临时整数值(您不可见),然后将其分配给double
。
您需要使表达式中的至少一个值成为double
(或float
),然后编译器会将所有算术提升为浮点,并且临时值也将为浮动类型。
如果表达式中没有常量,则还可以使用强制转换:
((float)i+J)/2
这3个项目中的哪一个都没有关系,只要一个就足够了。