如何在C中打印双精度数据类型

时间:2018-11-15 12:09:13

标签: c floating-point

为什么在C中,当我用%f打印一个双精度型变量时,它显示8.000000…,但这不是期望的结果。我想要类似8.5000的结果,如何实现呢?

 int main(){
     int i, j;
      double k;
      i=8; j=9;
      k = (i+j)/2;
      printf("%f", k);
    }

3 个答案:

答案 0 :(得分:1)

问题不在于格式说明符,而在于算术运算。

 k = (i+j)/2;

其中ij2-都是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个项目中的哪一个都没有关系,只要一个就足够了。