C#比较两个双重与.Equals()

时间:2016-11-17 11:11:29

标签: c# compare double

我使用ReShaper,当我将两个double值与==进行比较时,它表明我应该使用数学。具有公差的ABS方法。请参阅:https://www.jetbrains.com/help/resharper/2016.2/CompareOfFloatsByEqualityOperator.html

这个例子

double d = 0.0;
double d2 = 0.0;
if (d == d2)
{
    /* some code */
}
然后

转换为

double d = 0.0;
double d2 = 0.0;
if (Math.Abs(d - d2) < TOLERANCE)
{
    /* some code */
}

但我认为开发人员考虑正确的容忍度真的很复杂。所以我认为这可以在Double.Equals()方法中实现。

但是这个方法是这样实现的

public override bool Equals(Object obj) {
    if (!(obj is Double)) { 
        return false;
    } 
    double temp = ((Double)obj).m_value; 
    // This code below is written this way for performance reasons i.e the != and == check is intentional.
    if (temp == m_value) { 
        return true;
    }
    return IsNaN(temp) && IsNaN(m_value);
}

public bool Equals(Double obj)
{ 
    if (obj == m_value) {
        return true; 
    } 
    return IsNaN(obj) && IsNaN(m_value);
}

为什么?比较双值的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

您可以创建扩展方法

doubleValue.AlmostEqualTo(doubleValue2)

并像这样使用

#pa_buy-sell[]

答案 1 :(得分:0)

我最终使用了

double piConstant = 3.142;
double piFractional = 7/22;
if(piConstatnt.String("{0:0.00}")==piFractional.String("{0:0.00}")
{
    // some code
}

这让我可以通过设置所需的字符串格式来控制精度。 https://www.csharp-examples.net/string-format-double/

如果您想了解有关 Microsoft 的 Equals 方法的更多信息。 https://docs.microsoft.com/en-us/dotnet/api/system.double.equals?view=net-5.0