2012-11-17 45 views
1

我只是試圖通過使用遞增計數器通過計數器的模數相對於列表長度循環遍歷(10)名稱列表。但是,代碼似乎在這裏和那裏跳過一個數字。我已經嘗試了modf()和modff()和不同類型的castings,但沒有運氣。如何讓modf或modff正常工作?

下面是代碼示例:

defaultNameList = [NSArray arrayWithObjects:@"RacerX",@"Speed",@"Sprittle",@"Chim-Chim",@"Pops",@"Dale",@"Junior",@"Chip",@"Fred",@"Barney", nil]; 

float intpart; 
int pickName = (int)(modff(entryCount/10.0,&intpart) * 10.0); 
NSLog(@"%ld %f %f %f %d %@",entryCount, entryCount/10.0, modff(entryCount/10.0,&intpart), modff(entryCount/10.0,&intpart) * 10.0 ,pickName, [defaultNameList objectAtIndex:pickName]); 

的控制檯提供:

0 0.000000 0.000000 0.000000 0 RacerX 
1 0.100000 0.100000 1.000000 1 Speed 
2 0.200000 0.200000 2.000000 2 Sprittle 
3 0.300000 0.300000 3.000000 3 Chim-Chim 
4 0.400000 0.400000 4.000000 4 Pops 
5 0.500000 0.500000 5.000000 5 Dale 
6 0.600000 0.600000 6.000000 6 Junior 
7 0.700000 0.700000 7.000000 6 Junior 
8 0.800000 0.800000 8.000000 8 Fred 
9 0.900000 0.900000 9.000000 8 Fred 
10 1.000000 0.000000 0.000000 0 RacerX 

至於我可以告訴它不應該跳過pickName = 7或9,但確實如此。

+0

使用整數模數。 'entryCount'已經是一個整數,所以'entryCount%10'將產生'0','1',...或者'9'。 – pmg

回答

3

正在鑄造到(int)截斷該文件。也就是說,如果它不能在實際架構中使用的浮點系統中精確表示,並且小於精確值,則它將被舍入爲零。爲了解決這個問題,湊夠人數,而不是截斷的:

int pickName = (int)(modff(entryCount/10.0, &intpart) * 10.0 + 0.5); 

(這是假設的數量不爲負。)

然而,由於你與整數這裏工作,和浮點運算是昂貴的,你應該考慮使用模運算符來代替(運算整數):

int pickName = entryCount % 10; 
+0

模運算符是我想要和應該使用的實現,但根據我的理解,9.000000鑄造爲int應該給我9,而不是8.您是否建議儘管日誌顯示float爲9.000000,但實際上該數字可能是內部表示的至於8.999999999 ....? –

+0

@DanielSaban是的,可能是這種情況。 – 2012-11-17 22:28:19