C#有时1.0不是';T1?

C#有时1.0不是';T1?,c#,unity3d,C#,Unity3d,我有一个奇怪的问题。我的代码检查向量2的值,并基于该值返回枚举。 但我注意到,有时它会给出非常奇怪的结果,即使Vector2值连续几次相同,它也能给出不同的结果 protected eMove TranslateGridMove (Vector2 move) { if (move.x == 1f) { Debug.Log("Executing move " + move); return eMove.RIGHT; }

我有一个奇怪的问题。我的代码检查向量2的值,并基于该值返回枚举。 但我注意到,有时它会给出非常奇怪的结果,即使
Vector2
值连续几次相同,它也能给出不同的结果

protected eMove TranslateGridMove (Vector2 move) 
{
    if (move.x == 1f)
    {
        Debug.Log("Executing move " + move);
        return eMove.RIGHT;
    }
    else if (move.x == -1f)
    {
        Debug.Log("Executing move " + move);
        return eMove.LEFT;
    }
    else if (move.y == 1f)
    {
        Debug.Log("Executing move " + move);
        return eMove.UP;
    }
    else if (move.y == -1f)
    {
        Debug.Log("Executing move " + move);
        return eMove.DOWN;
    }
    else
    {
        Debug.LogWarning("PATH FINDING ERROR: CANNOT EXECUTE MOVE " + move);
        return eMove.NONE;
    }
}
结果:

Executing move (0.0, -1.0)
有时:

PATH FINDING ERROR: CANNOT EXECUTE MOVE (0.0, -1.0)

为什么有时它能按预期工作,有时不能?

在C中,literal value 1.0具有默认类型double。尝试将比较表达式1f更改为1d。

由于浮点类型在内存中的表示方式,您永远不应该对浮点类型进行比较。简而言之,这些值是使用两个的指数计算的,而最“好”的10个基值实际上无法准确表示。例如,您可以查找有关此的更详细信息

与其进行
a==b
比较,不如执行以下操作

if (Math.Abs(a - b) < TOLERANCE)
if(数学Abs(a-b)<公差)

如果
公差
是某个小常量,例如,
0.0001

浮点数不是无限精确的,则在使用浮点数进行计算时,会出现舍入误差。如果存在舍入误差,则很容易出现浮点非常接近但不完全为1.0的情况。请看:除非我显式地四舍五入或截断到指定的位数,否则我不会在浮点数上实现相等。关于这一点,没有常见问题解答/社区Wiki吗?@CompuChip:就好像新用户会阅读常见问题解答或Wiki一样。但是,是的,这个问题已经被问了几十次,回答了几百次。一个相当勤奋的搜索会找到关于这个主题的大量信息。搜索是新用户几乎从不做的另一件事。“大多数“好的”10个基本值实际上无法准确表示”——答案的这一部分非常误导,因为它意味着一个数量级为1的整数将是“无法准确表示”的这些“好的”值之一。事实上,这里的问题几乎与数字的实际表示无关。正是精度的简单限制阻止了相等比较的工作。您应该使用内置的Unity!它基本上是相等的。