我試圖比較一個double值來看它是否等於零。下面的工作:Equals與==比較雙倍零時
Assert.IsTrue(0d==0);
然而,這將失敗:
Assert.IsTrue(Equals(0d,0));
我認爲第二個參數(0)被當作整數。但是,我不明白爲什麼Equals(0d,0)評估爲false,而0d == 0爲true。它不能捨入,因爲兩個值都直接輸入爲零。
我試圖比較一個double值來看它是否等於零。下面的工作:Equals與==比較雙倍零時
Assert.IsTrue(0d==0);
然而,這將失敗:
Assert.IsTrue(Equals(0d,0));
我認爲第二個參數(0)被當作整數。但是,我不明白爲什麼Equals(0d,0)評估爲false,而0d == 0爲true。它不能捨入,因爲兩個值都直接輸入爲零。
我相信Equals(0d,0)也可能會進行類型比較。 0d在技術上不等於0,因爲它們不是同一類型。
編輯:
http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
這是它似乎如此。
MSDN:如果指定的Object等於當前Object,則爲true;否則,是錯誤的。
另外,你可以像Convert.ToDouble(0)的東西,它應該工作。我現在不在C#編譯器附近,因此我無法檢查是否正確。
直觀上它就像「他們不是兩個雙打」一樣簡單。
如果你想深入進去然而,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位。
如果您還包括比較實現,我會獲得更多'有趣'。 int.CompareTo(double)不會給你與double.CompareTo(int)相同的結果。如果你認真思考,你可以解釋所有的情況,但是你必須考慮隱式轉換(可以從int到double進行隱式轉換,而不是從double到int)。我的建議是始終確保通過進行明確的強制轉換或轉換來比較相同數字類型的值 – Eddy
另請參閱我的答案和註釋(int vs short):http://stackoverflow.com/questions/6780002/generic-list-of-objects-contained-short-returning-false – Eddy
+1,總是使用常見類型! – Blindy
在第一行中,==運算符將值轉換爲常用類型,而第二個方法作爲結果調用,並且在比較之前進行類型檢查,該類型檢查返回false,作爲一個值是double而另一個是整數。
「我試圖比較一個double值」 - 但是你正在比較'decimal'到'int' –
@亨克:我沒有在這裏遵循你的思路。小數點在哪裏? –
不,你說得對。再次跳過該m/d後綴。 –