我在一个空项目上对此进行了测试,但没有发生。
如您所见,当我减去 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 值完全相同的问题。我仍然想知道为什么这不会发生在同一个测试项目中(我现在正在做更多的测试)。