无法找到以下代码的原因:
#include int main() { float f = 0.1; if (f == 0.1) printf("True"); else printf("False"); return 0; }
输出为false。
#include int main() { float f = 0.1; if (f == (float)0.1) printf("True"); else printf("False"); return 0; }
现在显示正确的输出。 这背后的原因是什么?
这种行为的原因是什么呢?
#include main() { int n = 0, m = 0; if (n > 0) if (m > 0) printf("True"); else printf("False"); }
0.1
字面是double
。 你这里的精度松散float f = 0.1;
你可以说我们在比较期间再次失去精度,那么为什么f == 0.1
无论如何都不是真的? 因为float
延伸到double
,而不是相反。 在C中,较小的类型总是延伸到较大的类型。
简化你的例子,我们可以说double(float(1.0)) != 1.0
可能的解决方案:
更好的方案
浮点变量在比较中存在很多问题。 它们,包括这个,可以通过定义自己的比较函数来解决:
bool fp_equal(double a, double b, double eps = FLT_EPSILON) { return fabs(a - b) < fabs(eps * a); }
问题的第二部分:
为什么答案是假的是因为else
部分总是对应于最里面的if
块。 所以你对格式化很困惑,代码相当于:
#include int main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } else { printf("False"); } } }
回答你的第二个问题(第三个例子):
根据你的压缩,代码不会做你所期望的:
#include main() { int n = 0, m = 0; if (n > 0) if (m > 0) printf("True"); else printf("False"); }
这里的else
属于内在的if
,所以它等于
#include main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } else { printf("False"); } } }
但我想你的意思是:
#include main() { int n = 0, m = 0; if (n > 0) { if (m > 0) { printf("True"); } } else { printf("False"); } }
这是为什么一个人应该在if
语句中使用用户括号的一个很好的例子。
以上就是c/c++开发分享理解if()中的float变量比较相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549408.html