将双精度值与零进行比较时,等于==

时间:2011-08-18 21:55:15

标签: c# double equality

我正在尝试比较一个double值,看它是否等于零。以下内容适用:

Assert.IsTrue(0d==0);

但是这会失败:

Assert.IsTrue(Equals(0d,0));

我认为第二个参数(0)被视为整数。但是,我不明白为什么Equals(0d,0)的计算结果为false,而0d == 0的结果为true。它不能舍入,因为两个值都直接输入为零。

3 个答案:

答案 0 :(得分:4)

直观地说它就像“他们不是两个双打”一样容易。

如果你想深入探讨,Object.Equals(你在第二个例子中调用的静态方法)是这样的:

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool Equals(object objA, object objB)
{
    return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}

2个引用不相等,null也不相同,因此Double.Equals被虚拟调用:

public override bool Equals(object obj)
{
    if (!(obj is double))
    {
        return false;
    }
    double d = (double) obj;
    return ((d == this) || (IsNaN(d) && IsNaN(this)));
}

参数不是double,因此返回false

这取自mscorlib for .NET 4.0 64-bit。

答案 1 :(得分:2)

我认为Equals(0d,0)也可能正在进行类型比较。 0d在技术上不等于0,因为它们的类型不同。

编辑:

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx

似乎就是这种情况。

MSDN:如果指定的Object等于当前的Object,则为true;否则为否则,错误。

或者你可以像Convert.ToDouble(0)这样的东西,它应该工作。我现在不在C#编译器附近,所以我无法检查这是否正确。

答案 2 :(得分:0)

在第一行中,==运算符将值转换为公共类型,而在第二行中, Double.Equals 方法作为结果被调用,并且在比较之前进行类型检查返回false,因为一个值是 double ,另一个是整数