2011-08-18 69 views
1

我试图比较一个double值来看它是否等于零。下面的工作:Equals与==比较双倍零时

Assert.IsTrue(0d==0); 

然而,这将失败:

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

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

+0

“我试图比较一个double值” - 但是你正在比较'decimal'到'int' –

+1

@亨克:我没有在这里遵循你的思路。小数点在哪里? –

+0

不,你说得对。再次跳过该m/d后缀。 –

回答

2

我相信Equals(0d,0)也可能会进行类型比较。 0d在技术上不等于0,因为它们不是同一类型。

编辑:

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

这是它似乎如此。

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

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

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采取.NET 4.0 64位。

+1

如果您还包括比较实现,我会获得更多'有趣'。 int.CompareTo(double)不会给你与double.CompareTo(int)相同的结果。如果你认真思考,你可以解释所有的情况,但是你必须考虑隐式转换(可以从int到double进行隐式转换,而不是从double到int)。我的建议是始终确保通过进行明确的强制转换或转换来比较相同数字类型的值 – Eddy

+0

另请参阅我的答案和注释(int vs short):http://stackoverflow.com/questions/6780002/generic-list-of-objects-contained-short-returning-false – Eddy

+0

+1,总是使用常见类型! – Blindy

0

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