为啥浮点数据类型在没有类型转换 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
的类型为 double
,c
的类型为 float
。如果您比较float
和double
,float
首先会转换为double
。所以你的if
正在做:(double)(float)4.7 == 4.7
,这是错误的,因为在将4.7
转换为float
时,精度有所下降,并且数字略有变化。
您可以像这样if (fabs(f - 4.7) < 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整型自行变换为浮点及时间类型转换失败情况分析及解决