首页 > 后端开发 > C++ > 在比较看似相等的值时,为什么C#中的浮点算术会产生意外的结果?

在比较看似相等的值时,为什么C#中的浮点算术会产生意外的结果?

Patricia Arquette
发布: 2025-01-31 04:12:11
原创
822 人浏览过

Why Does Floating-Point Arithmetic in C# Produce Unexpected Results When Comparing Seemingly Equal Values?

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的计算引入了舍入错误。 而f1f2出现近距离,而它们的圆形浮点表示略有不同,从而使比较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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板