我正在尝试比较一个double值,看它是否等于零。以下内容适用:
Assert.IsTrue(0d==0);
但是这会失败:
Assert.IsTrue(Equals(0d,0));
我认为第二个参数(0)被视为整数。但是,我不明白为什么Equals(0d,0)的计算结果为false,而0d == 0的结果为true。它不能舍入,因为两个值都直接输入为零。
答案 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 ,另一个是整数。