-1

可能重复:
乘以 100 时出现神秘的计算错误

这是我面临的一个奇怪的问题。我将值 .6 存储到浮点变量中。当我将它乘以 100 时,我得到的答案是错误的 60.000004。这个 .000004 是从哪里来的?这是我的代码

NSlog(@"%f",self.dataHandler.correctPercentage * 100);
if (self.obj.percentage >= (self.dataHandler.correctPercentage * 100) )
{
    //Do something
}

我存储在 self.dataHandler.correctPercentage 中的值是 0.6。但是当我 NSlog 时,我得到 60.000004。由于这个原因,我的边界条件出错了。

为什么会这样?

4

3 回答 3

6

这是一个舍入误差。数字以二进制而不是十进制存储。可以精确编码为有限个二进制数字的分数与可以精确编码为十进制的分数不同。

对于十进制问题的示例,请考虑 1/3。如果我将 1/3 编码为 0.333,则 (1/3)*3 = 0.999。二进制也有同样的问题。

如果您需要以十进制形式准确编码十进制数字,那么您应该使用NSDecimalNumber为此设计的。

于 2012-08-23T13:54:12.927 回答
1

计算机无法保存大多数浮点数而不会出现舍入错误。这有几个含义,尤其是对于相等性检查——因为浮点数往往不相等,即使纯数学会让你这么认为。

在数学中,数字有不定式存储空间,可以使用不定式数字。但是计算机无法处理无穷大,因为它的资源有限。

你应该阅读每个计算机科学家应该知道的关于浮点运算的知识(至少前几段)

我昨天还查看了一个遇到类似问题的代码:https ://codereview.stackexchange.com/questions/14911/is-there-a-better-way-of-showing-an-image-based-on-the-电池电量/14961#14961

于 2012-08-23T13:54:56.087 回答
-1

%f,浮点变量在点后存储 6 个值。当计算机需要处理浮点数时,它会将它们扔给算术协处理器,并且在使用浮点数时会产生一些影响。

要获得准确答案,请将其转换为 Int 或使用显式舍入函数或浮点蕴涵求解算法。最好的一个取决于您的应用程序。

关于 Objective-C,您可以使用 NSDecimalNumber。

于 2012-08-23T14:02:08.470 回答