近日在开发《3D贪吃蛇》项目过程中发现了一个有趣的现象
Vector3 vec1 = new Vector3(0f , 0f , 3.6f); Dictionary<Vector3,int> dict = new Dictionary<Vector3,int>(); dict.add(vec1 , 1); Vector3 vec2 = new Vector3(0f , 0f , 1f*1.2f*3f); if(dict.Dontainkey(vec2)) { } else { Debug.LogErr("没找到对应的数据") }
总是会直行到 “没找到对应的数据”。最后发现3.6f 仅仅使用“==”运算符并不能相等。
由于计算机是用二进制来存储和处理数字,不能精确表示浮点数。
所以浮点数在计算过程中会丢失精度,所以引入如下的判断float相等的方法。
float a = 3.6f; float b = 1f*1.2f*3f; float c = Math.Abs(a-b); if(c <= 0.00001) { Debug.Log("两个数相等"); } else { Debug.Log("两个数不等"); }
做游戏开发1年以来,这是遇到的第一个坑。
在处理完之后发现自己虽然可以处理一些问题,但是基础还差很多,以后还需要加强基础知识的学习。
相关推荐
- **定义**: 定义了一个名为`sort`的函数,接收一个长度为3的`long float`类型的数组`x`作为参数。 - **功能**: 实现了对数组`x`中的三个元素进行排序的功能。 - **实现细节**: - 使用两个嵌套的`for`循环遍历数组...
这个函数需要三个参数:第一个参数是第一个浮点数,第二个参数是第二个浮点数,第三个参数是一个整数,表示要比较的小数位数。这个小数位数参数十分关键,因为它决定了比较的精度。 以给出的代码为例,我们有三个...
- `func(float n)`:这是一个返回浮点数绝对值的函数,通过比较参数`n`与零的大小来实现。 - `Min(float m, float n)`:找到两个浮点数中的最小值。 - `Max(float m, float n)`:找到两个浮点数中的最大值。 4. ...
在上面的代码中,我们定义了一个函数`method`,该函数将三条边长作为参数,并判断三角形的类型。主函数`main`用于获取用户输入的三条边长,并调用`method`函数来判断三角形的类型。 测试数据 我们可以使用以下测试...
由于浮点数的不精确性,两个看似相等的浮点数在二进制表示下可能并不完全相同,这可能导致比较结果出乎意料。因此,在实际编程中,我们通常需要考虑以下几点: 1. **精度误差**:由于浮点数的近似表示,比较时要...
这个函数接受三个float类型的参数,并返回一个float类型的结果。 3. 数组(Arrays) 数组用于存储固定大小的相同类型元素的集合。在文档中,可以看到二维数组的使用: ```c int t[][N] = {...}; ``` 这是一个二维...
//判断两个字符串是否相等,不能使用==,使用等号是判断两个对象是否是一个对象,也就是是否是一个内存地址。 //判断字符串的内容是否相同应该使用nsstring的isEqualToString:方法 //在低版本的时候,如果直接点击...
- 函数的定义格式为返回类型 函数名(参数列表),例如`float fun(float a, float b, float c)`定义了一个返回`float`类型并接受三个`float`类型参数的函数。 - 函数的调用和参数传递,如`sum=fun(x,y,z);`调用了`fun`...
- `Complex(float, float)`是带有两个参数的构造函数,用于创建一个指定实部和虚部的复数。 - `Complex(float = 0)`是一个转换构造函数,当传入一个浮点数时,创建一个实部为该数,虚部为0的复数。 - `Complex...
3. **判断日期是否相等的函数(isEDate)**: 设计一个成员函数,用于判断两个日期是否相等。 - **实现思路**: - 定义一个`isEDate(const Date& other)`成员函数。 - 比较当前对象与传入对象的`year`、`month`和`day...
例如,`ASSERT_TRUE()` 和 `EXPECT_TRUE()` 用于判断表达式是否为真,`ASSERT_EQ()` 和 `EXPECT_EQ()` 用于比较两个值是否相等。还有许多其他类型的断言,如`ASSERT_FLOAT_EQ()`(浮点数相等)、`ASSERT_THROW()`...
2. 二维数组a有m行n列,则在a[i][j]之前的元素个数为i*n+j。 知识点:在二维数组中,元素的索引可以用行列式索引,例如a[i][j]表示第i行第j列的元素。 3. 程序运行后的输出结果是10。 知识点:该程序使用了strlen...
- 在Java中,使用"=="运算符比较两个对象的内存地址,即判断两个引用是否指向同一个对象实例。 - 使用equals()方法比较两个对象的内容是否相等。equals()方法继承自Object类,其默认实现等同于使用"==",但可以...
`is`用于检查两个对象是否是同一个对象,即它们是否具有相同的内存地址,而`==`则检查两个对象的值是否相等。 【tuple 和 list 转换】 可以通过`tuple(list)`将列表转换为元组,用`list(tuple)`将元组转换为列表。 ...
这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 27 2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 28 2.15 如何确定域在结构中的...
第二个示例展示了如何获取用户的输入,并将该输入存储在一个字符串变量中。具体来说,代码首先提示用户输入姓名,然后使用`Console.ReadLine()`读取用户的输入,并将其存储在`strName`变量中。最后,程序使用`...
24.==是关系运算符,用于比较两个操作数是否相等;而=是赋值运算符,表示对变量赋值。 25.C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。 26.C语言中,数字字符'1'的值...
2. **定义Student类**:这个类有五个成员变量:sNO(学号)、sName(姓名)、sSex(性别)、sAge(年龄)和sJava(Java课程成绩)。类应有一个带参数的构造器,用于设置这些成员变量的值。还需提供五个getter方法,...
2. `rotationSpeed` 是一个float,控制角色转向的速度,数值越大,角色转得越快。 3. `canRun` 是一个布尔变量,用于判断角色是否可以开始移动,当角色完全面向目标时,此值变为true。 4. `speed` 也是float类型,...
6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存...