当前位置: 首页 > 知识库问答 >
问题:

Cocos2d,iOS,Objective-C:浮动错误[重复]

公孙阳羽
2023-03-14

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

如您所见,当我减去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;

编辑:我减去0.2f到remainingBossPercentage(对于每个boss敌人),所有的事情都很好,直到我到达最后一个敌人对象,它又是0.2f,我达到了做0.2f-0.2f的关键点(截图如下)

编辑2:我是伟大的所有评论和答案,也是关闭投票。促使我提出这个问题的是newValue是2.98023E-08这一事实。我现在看到还有比较问题(感谢投票关闭答案的人链接的极其有用的QA)。我想知道的是..为什么在我的只有2个测试变量的新测试项目中没有发生这种情况?(我创建了一个减去两个浮动的HelloWorld项目)。

我这样问是因为,正如一位用户所建议的那样,理解浮点而不采取shourtcuts是很重要的。是的,我问这个问题是走捷径,因为我今晚没有时间好好研究它,但我想尽力去理解和学习。我会仔细阅读答案,并花时间去理解,但如果我能理解的话,我想补充一个疑问:

会不会是因为内存管理的原因,两个项目(测试的一个和我的实际游戏)会发生不同的变化呢?这两个项目的不同之处可能与在肮脏的区域交换内存有关吗?(例如,内存使用量较大的游戏会被交换得更多,因此可能会丢失精度?)

PS:我查到了一个和2.98023 E-08值完全一样的问题。我仍然想知道的是,为什么在同一个测试项目中没有发生这种情况(我现在正在做一些更多的测试)。

共有1个答案

艾凌龙
2023-03-14

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

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

在基数为10的数字系统(0.333333...)中,1/3不能完全精确地表示但可以是以3为基数的数字系统。

 类似资料:
  • 如需集成DeepShare,请参考DeepShare iOS集成 1. 导入SDK 你可以用下面的方法进行导入: 方法1. 使用CocoaPods导入 若未安装CocoaPod,请先在终端执行 gem install cocoapods来安装CocoaPod 创建Podfile文件。若目录下没有Podfile文件,请在项目目录下执行pod init,若已有,请直接执行下一步 打开Podfile文件

  • 主要内容:NSError在Objective-C编程中,错误处理由框架中提供的类提供处理。 与仅使用错误代码或错误字符串相比,对象封装了更丰富且更具可扩展性的错误信息。 对象的核心属性是错误域(由字符串表示),特定于域的错误代码和包含应用程序特定信息的用户信息字典。 NSError Objective-C程序使用对象来传达有关用户需要了解的运行时错误的信息。 在大多数情况下,程序会在对话框或工作表中显示此错误信息。 但它

  • 以下是输出: 为什么我得到的是而不是?我知道这与浮点错误有关,但我无法把握为什么它正在发生,以及我应该做些什么来防止这种情况的发生(如果有办法的话)。有人能解释一下(或者给我指一个链接)会帮助我理解吗?欢迎任何输入。谢谢!

  • 我熟悉在Android中使用AsyncTask:创建一个子类,在子类的实例上调用execute,在UI线程或主线程上调用onPostExecute。iOS中的等价物是什么?

  • 动态绑定确定在运行时而不是在编译时调用的方法。 动态绑定也称为后期绑定。 在Objective-C中,所有方法都在运行时动态解析。执行的确切代码由方法名称(选择器)和接收对象确定。 动态绑定可实现多态性。例如,考虑一组对象,包括和。 每个对象都有自己的方法实现。 在下面的代码片段中,表达式执行的实际代码是在运行时确定的。 运行时系统使用方法运行的选择器来识别的任何类中的适当方法。 下面来看一下解释

  • 当我编译应用程序时,我得到一个错误,如下所示: 无法构建Objective-C模块“Firebase” 此错误出现在我的文件swift的中。