2011-03-02 73 views
4

我知道你不應該比較浮動使用.NET中的==平等運營商角度值,但它是安全的這樣做,如果這兩個數字分別使用Math.Floor地板?使用相等運算符來比較兩個地形雙打是否安全?

我用繪圖程序的工作,並在地圖上的塊存儲在不同的「地區」的文件。我可以通過將世界座標除以16來確定要檢索的區域,並將結果繪製到地圖上,從而獲得區域座標。

我基本上是問,是否使用==運算符來比較兩個具有相同整數部分(例如4.3和4.8)的值是否相同。

+0

這裏有一個相關的討論(儘管F#)這裏 - http://stackoverflow.com/questions/3109057/f-net-calculation-error-using-the-system-math-floor-function – 2011-03-02 18:39:37

回答

5

浮點比較的一般問題是它們可能很容易累加舍入誤差。當你把喜歡1.2值(不能爲正是表示爲十進制)100乘以和平等把它比作120。該建議是始終比較喜歡這樣的區別:

var a = 1.2; 
a *= 100; 

if (a - 120 < 0.0001) 
{ 
} 

Math.Floor操作,然而,總是導致一個整數值。也就是說,任何小數值都將被截斷,並且整數值將被保留。

所以,如果你的語義真的是使用地板,你是安全的。

但是,如果您確實想要四捨五入,請使用Math.Round()。

4

嗯,這取決於你想要做什麼。

,將告訴你的地板的值是否相等 - 但如果一個輸入是只是微幅下挫下2,和一個輸入是剛剛超過 2微幅下挫,那麼他們會不顧視爲異類,它們之間的差異可能很小。

這對你的情況沒關係嗎?在某些情況下,它會的,在某些情況下不會。

2

我認爲你的問題是基於錯誤的假設。在.Net中使用==來比較浮點值是完全安全的。相比自己當與==將返回false(由浮點說明書所指示的)與==和浮點值相關聯的唯一的奇數行爲是Double.NaNSingle.NaN

使用Math.Floor不使這一情況更好。如果任何特殊的浮點值(NaNNegativeInfinityPositiveInfinity)的傳遞給Math.Floor它們返回不變。所以通過==的比較仍然會有奇怪的行爲(Reference

使用Math.Floor的主要效果將會有更多的浮動值將相互比較相等。例如7.17.5將在Math.Floor後相等。這本質上不是更好,但可能是在您的應用程序的上下文中,但很難說它沒有更多的信息.​​.你能提供更多的細節在這裏爲什麼你認爲==是不安全的?

+1

我認爲這是更多關於舍入誤差,因此需要epsilon比較,而不是關於非有限值。 – CodesInChaos 2011-03-02 18:21:22

+0

查看我對上下文的編輯。 – mgbowen 2011-03-02 18:22:38