【问题标题】:Why float data type doesn't work in this code without type casting 4.7? [duplicate]为什么浮点数据类型在没有类型转换 4.7 的情况下在此代码中不起作用? [复制]
【发布时间】:2014-09-27 07:56:43
【问题描述】:
#include <stdio.h>

int main(void)

{
    float c;

    c = 4.7;

    if(c == 4.7)

    {
        printf("Hello World");
    }
    return 0;
}

这里的问题在于 float 数据类型...要打印 Hello world 我们需要编写 (float)4.7 为什么??

【问题讨论】:

标签: c


【解决方案1】:

4.7 的类型为 double,c 的类型为 float。如果您比较float 和double,float 首先会转换为double。所以你的if 正在做:(double)(float)4.7 == 4.7,这是错误的,因为在将4.7 转换为float 时,精度有所下降,并且数字略有变化。

您可以像这样if (fabs(f - 4.7) &lt; 1e-10) 进行近似比较。

【讨论】:

  • 另外,OP 应该知道:编译器可能将4.7 表示为4.699999...。这就是(float)4.7 != (double)4.7 的原因。但是编译器可以精确地表示一些其他数字,比如1。并且 OP 的程序可以在不使用这些数字进行类型转换的情况下工作。
  • if (f == 4.7f) 工作正常。
  • 是的。当然4.7f == 4.7f,因为它们具有相同的精度。
  • "4.7 as 4.699999..." -- 它们的值完全相同(参见youtube.com/watch?v=TINfzxSnnIE)。你真正想说的是 4.7 的二进制表示实际上比 4.7 略小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2018-12-15
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多