Cocos2d,iOS,目标C:浮点错误

Cocos2d,iOS,目标C:浮点错误,ios,cocos2d-iphone,floating-point,rounding-error,Ios,Cocos2d Iphone,Floating Point,Rounding Error,我在一个空项目上测试了这一点,没有发生 如您所见,当我减去bossPercentage值时,新值变为2.98023e-08。 只有当bossPercentage为0.2f且先前的值为0.2f时,才会发生这种情况。 差值应该是0.0f,但我不明白为什么我得到了2.98023e-08 作为参考,remainingBossPercentage是[GameController]类中的一个属性,定义如下: //header @property (readwrite, nonatomic) float r

我在一个空项目上测试了这一点,没有发生

如您所见,当我减去bossPercentage值时,新值变为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;
我想问你,我在做什么可能导致这个错误

编辑:我减去0.2f以保留BossPercentage(针对每个boss敌人),一切正常,直到我到达最后一个敌人对象,该对象再次具有0.2f,并且我达到了执行0.2f-0.2f的关键点(下面的屏幕截图)

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

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

可能是因为内存管理的原因,这两个项目(测试一和我的实际游戏)会有不同吗这两个项目的不同背景是否与脏区内存交换有关?(例如,内存使用量较大的游戏交换的次数较多,因此可能会导致精度损失?


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

简单地说,浮点数不应该完全准确

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

作为一个企业,1/3不能在10进制(0.333333…)中完全准确地表示,但可以在3进制中表示

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


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

之类的类,虽然这是一个合理的问题,但以前曾以多种形式提出过,并得到了很好的回答。请看一看和这里的其他问题,不要指望浮点数是精确的。唯一愚蠢的问题是你没有问的问题。阅读,学习,不断提问。02做一个测试项目(抱歉,不能添加一个答案来说明这一点):float c=1.0;c=c-.2;c=c-.2;c=c-.2;c=c-.2;CCLOG(@“%.12f”,c);控制台应该记录->main:0.20000032783 main:0.000000000000建议人们在指定的错误范围内比较浮点数通常是不好的。这要么以增加假阳性为代价减少假阴性,要么反之亦然。在不了解特定应用程序的需求的情况下,您无法知道这种权衡是改善了情况还是可以接受。因此,这是一个糟糕的建议。正确的建议是,计划使用浮点的软件工程师必须理解它,并且必须进行相应的设计。他们不应该走捷径。最好的建议可能是不要让自己陷入这样的境地。在某些情况下是必要的,例如
xctasertequalswithaccurity(a1,a2,accurity,format…)
。在这种情况下,最好的建议可能是只使用介于0和100之间的整数。