2

我在一个空项目上对此进行了测试,但没有发生

描述

如您所见,当我减去 bossPercentage 值时,newValue 变为2.98023e-08 。仅当bossPercentage为 0.2f 且先前值为 0.2f 时才会发生这种情况。 差异应该是 0.0f但我不明白为什么我会得到2.98023e-08

作为参考,remainingBossPercentage 是 [GameController] 类中的一个属性,定义如下:

//header
@property (readwrite, nonatomic) float remainingBossPercentage;
//.m
@synthetize remainingBossPercentage;
//init
remainingBossPercentage=1.0f;

我想问一下我可能正在做什么导致这个错误。

编辑:我从剩余BossPercentage 中减去 0.2f(对于每个boss敌人),一切正常,直到我到达最后一个再次具有 0.2f 的敌人对象,并且我达到了 0.2f - 0.2f 的关键点(下面的屏幕截图)

编辑 2:我非常感谢所有评论和答案,以及最后的投票。促使我提出这个问题的原因是 newValue 是 2.98023e-08。我现在看到还有比较问题(感谢投票关闭答案的人所链接的非常有用的 QA)。我想知道的是..为什么在我只有 2 个测试变量的新测试项目中不会发生这种情况?(我创建了一个减去两个浮点数的 HelloWorld 项目)。

我之所以这么问,是因为正如其中一位用户所建议的那样,理解浮点数而不走捷径很重要。是的,我问这个问题是走捷径,因为我今晚没有时间好好学习它,但我想尽我所能去理解和学习。我会正确阅读答案并花时间去理解,但如果同时可以的话,我想补充一个疑问:

可能是因为内存管理的原因,这两个项目(测试项目和我的实际游戏)表现不同吗?这两个项目的不同行为是否与脏区中的内存交换有某种联系?(例如,内存使用量更大的游戏被交换得更多,因此可能会损失精度?

PS:我发现了一个与 2.98023e-08 值完全相同的问题。我仍然想知道为什么这不会发生在同一个测试项目中(我现在正在做更多的测试)。

4

1 回答 1

1

简单地说,不应该期望浮点数是完全准确的。

浮点数(在我们常用的计算机中使用)本机以 2 为基数,而通常的数字是以 10 为基数。并非一个数字基数中的所有数字都可以在另一个数字基数中完全准确地表示。

作为一个 empale 1/3 不能完全准确地在以 10 为基数的系统中表示(0.333333 ...),但可以在以 3 为基数的系统中。

结果,需要将浮点数与指定的错误范围进行比较。取差值的绝对值并将其与允许范围进行比较。

因此,财务金额通常不(不应)表示为浮点数。这会产生诸如NSDecimalNumber.

于 2013-11-26T20:32:38.773 回答