CodeQL 文档

浮点数相等性检查

ID: cs/equality-on-floats
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - reliability
   - correctness
Query suites:
   - csharp-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

由于在存储和对浮点数执行算术运算时会遇到精度问题,因此直接比较两个浮点数是危险的。

建议

如果两个浮点数之差在一定的误差范围内,则应将它们视为相等。适当的误差范围取决于使用它的情况。

需要注意的是,浮点数比较是一个非常复杂的话题,我们的文档在这里采用了一种务实的做法,而不是试图面面俱到。强烈建议您查阅参考资料以获取更多信息。

示例

尽管您可能期望此示例输出“True”,但由于浮点运算执行方式不精确,它实际上输出“False”。

class EqualityCheckOnFloats
{
    public static void Main(string[] args)
    {
        Console.WriteLine((0.1 + 0.2) == 0.3);
    }
}

应更改该类以使用公差值执行比较,如下例所示。

class EqualityCheckOnFloatsFix
{
    public static void Main(string[] args)
    {
        const double EPSILON = 0.001;
        Console.WriteLine(Math.Abs((0.1 + 0.2) - 0.3) < EPSILON);
    }
}

参考资料

  • ©GitHub,Inc.
  • 条款
  • 隐私