目标C,浮动之间的划分没有给出确切的答案

时间:2014-02-28 22:56:02

标签: objective-c ios7 floating-accuracy

现在我有一行代码如下:

float x = (([self.machine micSensitivity] - 0.0075f) / 0.00025f);

[self.machine micSensitivity]是包含值0.010000

的浮点数

所以,

0.01 - 0.0075 = 0.0025
0.0025 / 0.00025 = 10.0

但在这种情况下,它会一直返回9.999999

我假设有某种舍入错误,但我似乎无法找到一种简洁的方法来修复它。 micSensitivity递增/递减0.00025,并且该公式意味着返回一个干净的整数值供用户引用,所以我宁愿让编程正确而不仅仅是添加0.000000000001。< / p>

感谢。

5 个答案:

答案 0 :(得分:1)

  

该公式旨在返回一个干净的整数值供用户引用

如果这对你真的很重要,那你为什么不将这个故事中的所有数字乘以10000,强制转换为int,并进行整数运算?

或者,如果您知道答案是任意接近整数,则舍入到该整数并显示它。

答案 1 :(得分:1)

浮点运算是二进制,而不是十进制。它几乎总会给出舍入错误。你需要考虑到这一点。 “float”具有大约六位数的精度。 “double”具有大约15位数的精度。你没有任何理由抛弃9位精度。

现在想想:你想要展示什么?如果计算结果为9.999999999,您想要显示什么?如果结果是9.538105712,您想要显示什么?

答案 2 :(得分:1)

除了10.0之外,您的问题中的所有数字都不能在iOS上的floatdouble中准确表示。如果你想用这些数字进行float数学计算,你就会出现舍入错误。

您可以轻松地将结果四舍五入到最接近的整数:

float x = rintf((self.machine.micSensitivity - 0.0075f) / 0.00025f);

或者您可以将所有数字(包括micSensitivity的允许值)乘以4000(即1 / 0.00025),从而完全使用整数。

或者您可以更改micSensitivity的允许值,使其增量为分母为2的幂的分数。例如,如果使用增量0.000244140625(即2 -12 ),并将0.0075更改为0.00732421875(即30 * 2 -12 ),只要您的micSensitivity在±4096范围内,就应该得到准确的结果(因为4096是2 12 而且float有24位有效数字。)

答案 3 :(得分:0)

您发布的代码正确且功能正常。这是使用浮点运算的已知副作用。请参阅floating point accuracy problems上的wiki,了解原因。

根据您需要使用的数字,有几种方法可以解决此问题。

如果你需要比较两个花车,那么大多数都可以正常工作:小于和大于你所期望的。唯一的麻烦是测试两个浮点数是否相等。

// If x and y are within a very small number from each other then they are equal.
if (fabs(x - y) < verySmallNumber) { // verySmallNumber is usually called epsilon.
    // x and y are equal (or at least close enough)
}

如果要打印浮动,则可以指定要舍入的精度。

// Get a string of the x rounded to five digits of precision.
NSString *xAsAString = [NSString stringWithFormat:@"%.5f", x];

答案 4 :(得分:-1)

9.999999等于10.证明: 9.999999 = x然后10x = 99.999999然后10x-x = 9x = 90然后x = 10