我正在测试我的代码。我有浮点数的布尔条件。
我指定一个浮点值来测试我的代码:
float testFloatValue = 0.9;
并且不符合布尔条件:
if (testFloatValue == 0.9) {
}
因为我在调试时,我的浮点数已从 0.9 变为 0.899999976
我什么都不懂!
答案 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
}
浮点是一个庞大而复杂的话题,绝对值得研究以获得良好的把握。从这里开始:
你一定要阅读这个关于浮点的精彩介绍: