簡單的問題,我知道必須有一個正確的方法來做到這一點。我有一個CGFloat,以1/16的增量增加。我想確定這個值何時變成一個整數。objective-c檢查float和int是否相等 - 是2.0000 == 2
由於缺乏對正確方法的認識,所以我想出了一些想法,比如讓另一個變量跟蹤迭代的次數,以及mod 16
它。
簡單的問題,我知道必須有一個正確的方法來做到這一點。我有一個CGFloat,以1/16的增量增加。我想確定這個值何時變成一個整數。objective-c檢查float和int是否相等 - 是2.0000 == 2
由於缺乏對正確方法的認識,所以我想出了一些想法,比如讓另一個變量跟蹤迭代的次數,以及mod 16
它。
雖然你一般不能在小數浮點數計算總結到全數字,你的情況是例外,因爲1/16
是2^(-4)
,這個數字可以通過浮動精確地表示:
- (void)testFloat
{
float a = 0.0f;
while (a != 2.0f) {
a += 0.0625f;
}
NSLog(@"OK!");
}
請注意,如果您想要可靠地達到整數,您必須從1/16(例如'0.0f')的精確倍數開始。 –
浮點運算是不精確的,所以你不能指望你的變量的值永遠是2.0000
。
「因爲我不知道正確的方法,所以我想出了一些想法,比如讓另一個變量跟蹤迭代次數,並調用它16。
這是一個美妙的想法。
是的,你可以依靠它。 「1.0/16.0」是確切的,因此反覆添加它會得到完整的數字。唯一的問題是,一旦你的浮點數值變得足夠大,增加它就會導致四捨五入,並最終變成空操作。 –
這是更好地圍繞做的另一種方式,即用一個整數循環計數器和它轉換爲一個float:
for (int i = 0; i < 100; ++i)
{
float x = (float)i/16.0f;
if (i % 16 == 0)
{
// if x is whole number...
}
}
一個更好的解決辦法是由1增加一個int,然後通過16除以它來獲得完整的號碼。 – Pubby
通常,當比較相等時,應該取差值的絕對值,然後將其與「epsilon」進行比較 - 這是一個大於浮點固有誤差但小於所需精度的值。 –