当双精度数与零比较时,= vs ==
本文关键字:比较 vs 双精度 | 更新日期: 2023-09-27 18:06:08
我试图比较一个双精度值,看看它是否等于零。下面的命令可以工作:
Assert.IsTrue(0d==0);
但是这将失败:
Assert.IsTrue(Equals(0d,0));
我认为第二个参数(0)被视为整数。然而,我不明白为什么Equals(0d, 0)评估为假,而0d==0是真的。它不能四舍五入,因为这两个值都是直接作为零输入的。
直观上就像"它们不都是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,因为一个值是双精度,另一个值是整型。