c#浮点算术:精确和比较陷阱
>c#的浮点算术虽然方便,但由于其有限的表示而遭受了固有的不精确。 在比较看似相等的值时,这可能会导致意外的结果。
>考虑此示例:
<code class="language-csharp">class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); // Outputs "false" } }</code>
输出是违反直觉的。 为什么?因为在C#中的32位浮子的精度有限(约23位显着)。 涉及0.09f
的计算引入了舍入错误。 而f1
和f2
出现近距离,而它们的圆形浮点表示略有不同,从而使比较f1 > f2
返回false
。
> 为了避免这些问题,请避免进行直接的平等检查。相反,使用基于公差的比较:
此功能检查两个浮子之间的绝对差异是否小于预定义的
<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance) { return Math.Abs(a - b) < tolerance; }</code>
取决于上下文和预期的精度水平。 为了获得更高的精度,请考虑使用tolerance
而不是tolerance
。 但是,即使double
也受到类似的局限性,尽管精度更高。
以上是在比较看似相等的值时,为什么C#中的浮点算术会产生意外的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!