当双精度数与零比较时,= vs ==

本文关键字:比较 vs 双精度 | 更新日期: 2023-09-27 18:06:08

我试图比较一个双精度值,看看它是否等于零。下面的命令可以工作:

Assert.IsTrue(0d==0);

但是这将失败:

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

我认为第二个参数(0)被视为整数。然而,我不明白为什么Equals(0d, 0)评估为假,而0d==0是真的。它不能四舍五入,因为这两个值都是直接作为零输入的。

当双精度数与零比较时,= vs ==

直观上就像"它们不都是double "一样简单。

如果你想深入,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)));
}

两个引用不相等,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位。

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

编辑:

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

似乎是这样。

MSDN:如果指定的对象等于当前对象,则返回true;否则,假的。

或者你可以使用类似于Convert.ToDouble(0)的命令,它应该可以工作。我现在不在c#编译器附近,所以我不能检查这是否正确。

第一行==操作符将值转换为通用类型,第二行为Double类型。Equals方法作为结果调用,它在比较之前进行类型检查并返回false,因为一个值是双精度,另一个值是整型