为啥浮点数据类型在没有类型转换 4.7 的情况下在此代码中不起作用? [复制]

Posted

技术标签:

【中文标题】为啥浮点数据类型在没有类型转换 4.7 的情况下在此代码中不起作用? [复制]【英文标题】: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 为什么??

【问题讨论】:

因为数字的浮点表示不精确。阅读此***.com/questions/2100490/… How dangerous is it to compare floating point values? 你会想阅读The Floating-Point Guide - What Every Programmer Should Know ...。问题是你没有比较你认为的自己。 只有那些具有精确二进制表示的浮点值才能被比较,例如:如果你做 2.5 == 2.5。 【参考方案1】:

4.7 的类型为 doublec 的类型为 float。如果您比较floatdoublefloat 首先会转换为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 略小。

以上是关于为啥浮点数据类型在没有类型转换 4.7 的情况下在此代码中不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在java中的double和float类型数据相除为啥可以除以零

Pandas整型自行变换为浮点及时间类型转换失败情况分析及解决

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

63.C++类型转换

为啥在浮点转换中会发生这种情况?

如何在没有类型错误的情况下在 python 3.5.0 上导入 sklearn?