#include<stdio.h>
void main()
{
float a = 2.3;
if(a == 2.3) {
pritnf("hello");
}
else {
printf("hi");
}
}
它打印&#34; hi&#34;在输出中,或者我们可以说如果条件得到假值。
#include<stdio.h>
void main()
{
float a = 2.5;
if(a == 2.5)
printf("Hello");
else
printf("Hi");
}
打印你好。
答案 0 :(得分:12)
变量a
是float
,其值保持接近数学值2.3。
文字2.3
是double
,它也保留了接近数学值2.3的某些值,但由于double
的精度高于float
,因此可能是与a
的值不同的值。 float
和double
都只能表示有限数量的值,因此无法用这两种类型中的任何一种精确表示数学实数。
在比较a == 2.3
中,左操作数从float
升级为double
。此促销是准确的,并保留了价值(正如所有促销所做的那样),但如上所述,该值可能与2.3
字面值不同。
要在浮点数之间进行比较,可以使用适当的浮点字面值:
assert(a == 2.3f);
// ^
答案 1 :(得分:3)
2.3
为01000000000100110011001100110011...
所以你无法将一个浮点数设置为2.3
使用双精度,你会得到类似的东西:2.299999952316284
当你写下:
时,你将一个double转换为floatfloat a = 2.3;
if检查float a
是否等于double 2.299999952316284
你应该写:
float a = 2.3f;
你可以检查:
if (a == 2.3f) {
...
}
我宁愿测试:
if (fabs(a - 2.3f) < 0.00001) {
...
}
用比特表示的2.5
是:01000000001000000000000000000000
编辑: fabs
是<math.h>
或<cmath>
阅读本文:article
答案 2 :(得分:0)
比较浮点值并不像看起来那么容易,请查看Most effective way for float and double comparison。
这一切归结为事实,浮点数不准确(好吧 大多数不是)。通常通过允许一个小错误窗口(epsilon)来比较2个浮点数:
if( fabs(a - 2.3f) < epsion) { ... }
其中epsilon足够小,可用于计算,但不能太小(大于Machine epsilon)。