3 回答

TA貢獻(xiàn)1878條經(jīng)驗 獲得超4個贊
它是安全的期望,比較將返回true
當(dāng)且僅當(dāng)雙變量具有完全相同的值0.0
(在你原來的代碼片段,當(dāng)然,這種情況)。這與==
操作符的語義一致。a == b
表示“ a
等于b
”。
當(dāng)在純數(shù)學(xué)中相同計算的結(jié)果為零時,期望某種計算的結(jié)果在雙精度(或更普遍地為浮點數(shù))算法中為零是不安全的(因為它是不正確的)。這是因為當(dāng)計算深入時,會出現(xiàn)浮點精度誤差-這個概念在數(shù)學(xué)的實數(shù)運(yùn)算中不存在。

TA貢獻(xiàn)1777條經(jīng)驗 獲得超10個贊
如果您需要進(jìn)行大量“相等”比較,則最好在.NET 3.5中編寫一些輔助函數(shù)或擴(kuò)展方法以進(jìn)行比較:
public static bool AlmostEquals(this double double1, double double2, double precision)
{
return (Math.Abs(double1 - double2) <= precision);
}
可以通過以下方式使用此方法:
double d1 = 10.0 * .1;
bool equals = d1.AlmostEquals(0.0, 0.0000001);

TA貢獻(xiàn)1876條經(jīng)驗 獲得超5個贊
對于您的簡單樣本,該測試還可以。但是呢:
bool b = ( 10.0 * .1 - 1.0 == 0.0 );
請記住,.1是二進(jìn)制的重復(fù)十進(jìn)制數(shù),不能精確表示。然后將其與以下代碼進(jìn)行比較:
double d1 = 10.0 * .1; // make sure the compiler hasn't optimized the .1 issue away
bool b = ( d1 - 1.0 == 0.0 );
我將讓您進(jìn)行測試以查看實際結(jié)果:您更有可能以這種方式記住它。
- 3 回答
- 0 關(guān)注
- 589 瀏覽
添加回答
舉報