我知道你不應該比較浮動使用.NET中的==
平等運營商角度值,但它是安全的這樣做,如果這兩個數字分別使用Math.Floor
地板?使用相等運算符來比較兩個地形雙打是否安全?
我用繪圖程序的工作,並在地圖上的塊存儲在不同的「地區」的文件。我可以通過將世界座標除以16來確定要檢索的區域,並將結果繪製到地圖上,從而獲得區域座標。
我基本上是問,是否使用==
運算符來比較兩個具有相同整數部分(例如4.3和4.8)的值是否相同。
我知道你不應該比較浮動使用.NET中的==
平等運營商角度值,但它是安全的這樣做,如果這兩個數字分別使用Math.Floor
地板?使用相等運算符來比較兩個地形雙打是否安全?
我用繪圖程序的工作,並在地圖上的塊存儲在不同的「地區」的文件。我可以通過將世界座標除以16來確定要檢索的區域,並將結果繪製到地圖上,從而獲得區域座標。
我基本上是問,是否使用==
運算符來比較兩個具有相同整數部分(例如4.3和4.8)的值是否相同。
浮點比較的一般問題是它們可能很容易累加舍入誤差。當你把喜歡1.2
值(不能爲正是表示爲十進制)100
乘以和平等把它比作120
。該建議是始終比較喜歡這樣的區別:
var a = 1.2;
a *= 100;
if (a - 120 < 0.0001)
{
}
的Math.Floor
操作,然而,總是導致一個整數值。也就是說,任何小數值都將被截斷,並且整數值將被保留。
所以,如果你的語義真的是使用地板,你是安全的。
但是,如果您確實想要四捨五入,請使用Math.Round()。
嗯,這取決於你想要做什麼。
,將告訴你的地板的值是否相等 - 但如果一個輸入是只是微幅下挫下2,和一個輸入是剛剛超過 2微幅下挫,那麼他們會不顧視爲異類,它們之間的差異可能很小。
這對你的情況沒關係嗎?在某些情況下,它會的,在某些情況下不會。
我認爲你的問題是基於錯誤的假設。在.Net中使用==來比較浮點值是完全安全的。相比自己當與==
將返回false
(由浮點說明書所指示的)與==
和浮點值相關聯的唯一的奇數行爲是Double.NaN
和Single.NaN
。
使用Math.Floor
不使這一情況更好。如果任何特殊的浮點值(NaN
,NegativeInfinity
,PositiveInfinity
)的傳遞給Math.Floor
它們返回不變。所以通過==
的比較仍然會有奇怪的行爲(Reference)
使用Math.Floor
的主要效果將會有更多的浮動值將相互比較相等。例如7.1
和7.5
將在Math.Floor
後相等。這本質上不是更好,但可能是在您的應用程序的上下文中,但很難說它將沒有更多的信息..你能提供更多的細節在這裏爲什麼你認爲==
是不安全的?
我認爲這是更多關於舍入誤差,因此需要epsilon比較,而不是關於非有限值。 – CodesInChaos 2011-03-02 18:21:22
查看我對上下文的編輯。 – mgbowen 2011-03-02 18:22:38
這裏有一個相關的討論(儘管F#)這裏 - http://stackoverflow.com/questions/3109057/f-net-calculation-error-using-the-system-math-floor-function – 2011-03-02 18:39:37