无法达到一定的浮动价值

时间:2015-04-07 21:40:35

标签: xcode floating-accuracy

我正在测试我的代码。我有浮点数的布尔条件。

我指定一个浮点值来测试我的代码:

float testFloatValue = 0.9;

并且不符合布尔条件:

if (testFloatValue == 0.9) {

}

因为我在调试时,我的浮点数已从 0.9 变为 0.899999976

我什么都不懂!

2 个答案:

答案 0 :(得分:2)

由于浮点数的性质,某些值无法准确表示。所以你永远不想直接检查平等......在网上有很多关于这个的文章,如果你搜索,你会发现很多。但是,这是一个快速例程,您可以在Objective C中使用它来检查ALMOST是否相等。

bool areAlmostEqual(double result, double expectedResult)
{
    return fabs(result - expectedResult) < .0000000001;
}

您可以根据原始问题中的值使用它:

if(areAlmostEqual(testFloatValue, 0.9) {
    // Do something
}

答案 1 :(得分:0)

这是一种非常常见的误解。浮点数是实数的近似表示。最常见的浮点标准(IEEE 754)使用基数2,基数2不能直接表示所有基数10。

这与Xcode无关 当您编写0.9 9 * 10^-1时,计算机将其存储为最接近的二进制等效项,以基数2表示。当此二进制(基数2)近似值转换为时用于显示的十进制(基数为10),您得到的0.899999976与浮点数一样可以代表您的数字。

比较浮点数的标准方法是选择精度或容差,通常称为 epsilon ,这是两个数字被认为相等的接近程度(即。 “足够近”)。并且因为最接近的近似可能略低于或略高于您的数字,您将采用绝对差异并与容差进行比较。因此:

const float eps = 0.00001f;
if (fabs(a - b) < eps)
{
    // a and b are approximately equal
}

浮点是一个庞大而复杂的话题,绝对值得研究以获得良好的把握。从这里开始:

你一定要阅读这个关于浮点的精彩介绍: