为什么if(a == 2.3)在浮动时评估为假a = 2.3

时间:2016-09-21 12:21:35

标签: c

#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");
}

打印你好。

3 个答案:

答案 0 :(得分:12)

变量afloat,其值保持接近数学值2.3。

文字2.3double,它也保留了接近数学值2.3的某些值,但由于double的精度高于float,因此可能是与a的值不同的值。 floatdouble都只能表示有限数量的值,因此无法用这两种类型中的任何一种精确表示数学实数。

在比较a == 2.3中,左操作数从float升级为double。此促销是准确的,并保留了价值(正如所有促销所做的那样),但如上所述,该值可能与2.3字面值不同。

要在浮点数之间进行比较,可以使用适当的浮点字面值:

assert(a == 2.3f);
//             ^

答案 1 :(得分:3)

带有二进制表示的

2.301000000000100110011001100110011... 所以你无法将一个浮点数设置为2.3 使用双精度,你会得到类似的东西:2.299999952316284

当你写下:

时,你将一个double转换为float
float 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)。