使用包含方法检查列表中浮点数时的 C# 准确性<float>



i有一个 float s的列表,并且要检查它是否已经包含了使用List.Contains()方法的特定值。我知道,对于float平等测试,您通常无法使用==,而是myFloat - value < 0.001

我的问题是,Contains方法是否对此表示帐户,或者我需要使用float精度错误来测试的方法,如果float在列表中?

来自 List(T).Contains的文档:

此方法通过使用默认平等比较来确定平等,这是由对象的 IEquatable<T>.Equals方法实现的t(列表中的值类型)。

因此,您需要自己处理与阈值的比较。例如,您可以使用自己的自定义平等比较。这样的东西:

public class FloatThresholdComparer : IEqualityComparer<float>
{
    private readonly float _threshold;
    public FloatThresholdComparer(float threshold)
    {
        _threshold = threshold;
    }
    public bool Equals(float x, float y)
    {
        return Math.Abs(x-y) < _threshold;
    }
    public int GetHashCode(float f)
    {
        throw new NotImplementedException("Unable to generate a hash code for thresholds, do not use this for grouping");
    }
}

并使用它:

var result = floatList.Contains(100f, new FloatThresholdComparer(0.01f))

它仅使用列表中包含的对象的默认相等比较。执行比较时,这将等同于调用object.Equals()

如果您需要不同的平等实现,则可以使用接受平等比较的LINQ Contains()超载。然后,您只需要实现该比较并将其传递。

其他答案是正确的,但是如果您想要一个替代的快速和折叠解决方案而不编写新的平等比较,则可以使用列表。Exists方法:

bool found = list.Exists(num => Math.Abs(num - valueToFind) < 0.001);

编辑: 我的原始答案说以上是LINQ,但是存在方法是列表类的一部分。使用ienumerable使用LINQ相同的概念。任何:

bool found = list.Any(num => Math.Abs(num - valueToFind) < 0.001);

相关内容

  • 没有找到相关文章

最新更新