2012-11-27 69 views
1

簡單的問題,我知道必須有一個正確的方法來做到這一點。我有一個CGFloat,以1/16的增量增加。我想確定這個值何時變成一個整數。objective-c檢查float和int是否相等 - 是2.0000 == 2

由於缺乏對正確方法的認識,所以我想出了一些想法,比如讓另一個變量跟蹤迭代的次數,以及mod 16它。

+0

一個更好的解決辦法是由1增加一個int,然後通過16除以它來獲得完整的號碼。 – Pubby

+0

通常,當比較相等時,應該取差值的絕對值,然後將其與「epsilon」進行比較 - 這是一個大於浮點固有誤差但小於所需精度的值。 –

回答

4

雖然你一般不能在小數浮點數計算總結到全數字,你的情況是例外,因爲1/162^(-4),這個數字可以通過浮動精確地表示:

- (void)testFloat 
{ 
    float a = 0.0f; 

    while (a != 2.0f) { 
     a += 0.0625f; 
    } 

    NSLog(@"OK!"); 
} 
+2

請注意,如果您想要可靠地達到整數,您必須從1/16(例如'0.0f')的精確倍數開始。 –

1

浮點運算是不精確的,所以你不能指望你的變量的值永遠是2.0000

「因爲我不知道正確的方法,所以我想出了一些想法,比如讓另一個變量跟蹤迭代次數,並調用它16。

這是一個美妙的想法。

+2

是的,你可以依靠它。 「1.0/16.0」是確切的,因此反覆添加它會得到完整的數字。唯一的問題是,一旦你的浮點數值變得足夠大,增加它就會導致四捨五入,並最終變成空操作。 –

2

這是更好地圍繞做的另一種方式,即用一個整數循環計數器和它轉換爲一個float:

for (int i = 0; i < 100; ++i) 
{ 
    float x = (float)i/16.0f; 

    if (i % 16 == 0) 
    { 
     // if x is whole number... 
    } 
}