`
未来程序员
  • 浏览: 26072 次
社区版块
存档分类
最新评论

判断2个float参数相等的办法

阅读更多

近日在开发《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`循环遍历数组...

    PHP中两个float(浮点数)比较实例分析

    这个函数需要三个参数:第一个参数是第一个浮点数,第二个参数是第二个浮点数,第三个参数是一个整数,表示要比较的小数位数。这个小数位数参数十分关键,因为它决定了比较的精度。 以给出的代码为例,我们有三个...

    C语言判断点面位置关系系统.doc

    - `func(float n)`:这是一个返回浮点数绝对值的函数,通过比较参数`n`与零的大小来实现。 - `Min(float m, float n)`:找到两个浮点数中的最小值。 - `Max(float m, float n)`:找到两个浮点数中的最大值。 4. ...

    C语言判断三角形类型.doc

    在上面的代码中,我们定义了一个函数`method`,该函数将三条边长作为参数,并判断三角形的类型。主函数`main`用于获取用户输入的三条边长,并调用`method`函数来判断三角形的类型。 测试数据 我们可以使用以下测试...

    reg_compare.rar_Compare_floating

    由于浮点数的不精确性,两个看似相等的浮点数在二进制表示下可能并不完全相同,这可能导致比较结果出乎意料。因此,在实际编程中,我们通常需要考虑以下几点: 1. **精度误差**:由于浮点数的近似表示,比较时要...

    计算机二级考试VC部分试题及答案.pdf

    这个函数接受三个float类型的参数,并返回一个float类型的结果。 3. 数组(Arrays) 数组用于存储固定大小的相同类型元素的集合。在文档中,可以看到二维数组的使用: ```c int t[][N] = {...}; ``` 这是一个二维...

    ios开发记录

    //判断两个字符串是否相等,不能使用==,使用等号是判断两个对象是否是一个对象,也就是是否是一个内存地址。 //判断字符串的内容是否相同应该使用nsstring的isEqualToString:方法 //在低版本的时候,如果直接点击...

    计算机二级考试(VC)部分试题及答案.pdf

    - 函数的定义格式为返回类型 函数名(参数列表),例如`float fun(float a, float b, float c)`定义了一个返回`float`类型并接受三个`float`类型参数的函数。 - 函数的调用和参数传递,如`sum=fun(x,y,z);`调用了`fun`...

    C++作业(复数类2)1

    - `Complex(float, float)`是带有两个参数的构造函数,用于创建一个指定实部和虚部的复数。 - `Complex(float = 0)`是一个转换构造函数,当传入一个浮点数时,创建一个实部为该数,虚部为0的复数。 - `Complex...

    C++程序设计练习题

    3. **判断日期是否相等的函数(isEDate)**: 设计一个成员函数,用于判断两个日期是否相等。 - **实现思路**: - 定义一个`isEDate(const Date& other)`成员函数。 - 比较当前对象与传入对象的`year`、`month`和`day...

    MyGtest测试示例.zip

    例如,`ASSERT_TRUE()` 和 `EXPECT_TRUE()` 用于判断表达式是否为真,`ASSERT_EQ()` 和 `EXPECT_EQ()` 用于比较两个值是否相等。还有许多其他类型的断言,如`ASSERT_FLOAT_EQ()`(浮点数相等)、`ASSERT_THROW()`...

    套题4---C语言程序设计---答案.pdf

    2. 二维数组a有m行n列,则在a[i][j]之前的元素个数为i*n+j。 知识点:在二维数组中,元素的索引可以用行列式索引,例如a[i][j]表示第i行第j列的元素。 3. 程序运行后的输出结果是10。 知识点:该程序使用了strlen...

    50个Java常用面试题

    - 在Java中,使用"=="运算符比较两个对象的内存地址,即判断两个引用是否指向同一个对象实例。 - 使用equals()方法比较两个对象的内容是否相等。equals()方法继承自Object类,其默认实现等同于使用"==",但可以...

    python试卷-不能创建一个字典的语句 (2).pdf

    `is`用于检查两个对象是否是同一个对象,即它们是否具有相同的内存地址,而`==`则检查两个对象的值是否相等。 【tuple 和 list 转换】 可以通过`tuple(list)`将列表转换为元组,用`list(tuple)`将元组转换为列表。 ...

    《你必须知道的495个C语言问题》

    这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 27  2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 28 2.15 如何确定域在结构中的...

    以前刚接触C#的一些程序

    第二个示例展示了如何获取用户的输入,并将该输入存储在一个字符串变量中。具体来说,代码首先提示用户输入姓名,然后使用`Console.ReadLine()`读取用户的输入,并将其存储在`strName`变量中。最后,程序使用`...

    C语言理论判断题&选择题.docx

    24.==是关系运算符,用于比较两个操作数是否相等;而=是赋值运算符,表示对变量赋值。 25.C程序中,用一对大括号{}括起来的多条语句称为复合语句,复合语句在语法上被认为是一条语句。 26.C语言中,数字字符'1'的值...

    java编程题 (2).docx

    2. **定义Student类**:这个类有五个成员变量:sNO(学号)、sName(姓名)、sSex(性别)、sAge(年龄)和sJava(Java课程成绩)。类应有一个带参数的构造器,用于设置这些成员变量的值。还需提供五个getter方法,...

    角色转身向前走的脚本2

    2. `rotationSpeed` 是一个float,控制角色转向的速度,数值越大,角色转得越快。 3. `canRun` 是一个布尔变量,用于判断角色是否可以开始移动,当角色完全面向目标时,此值变为true。 4. `speed` 也是float类型,...

    你必须知道的495个C语言问题

    6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存...

Global site tag (gtag.js) - Google Analytics