浮点数相等性检查¶
ID: cs/equality-on-floats
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
- correctness
Query suites:
- csharp-security-and-quality.qls
由于在存储和对浮点数执行算术运算时会遇到精度问题,因此直接比较两个浮点数是危险的。
建议¶
如果两个浮点数之差在一定的误差范围内,则应将它们视为相等。适当的误差范围取决于使用它的情况。
需要注意的是,浮点数比较是一个非常复杂的话题,我们的文档在这里采用了一种务实的做法,而不是试图面面俱到。强烈建议您查阅参考资料以获取更多信息。
示例¶
尽管您可能期望此示例输出“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);
}
}
参考资料¶
Oracle 数值计算指南:每个计算机科学家都应该知道的浮点运算知识。
Bruce Dawson:比较浮点数。