1

私は単に、リストの長さに対するカウンターのモジュラスをとることによって、増分カウンターを使用して(10)名前のリストを循環しようとしています。ただし、コードはあちこちで数字をスキップしているようです。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をスキップするべきではありませんが、スキップします。

4

1 に答える 1

3

(int)ファイルを切り捨てるためにキャストします。つまり、実際のアーキテクチャで使用されている浮動小数点システムで正確に表現できず、正確な値よりも少し小さい場合は、ゼロに丸められます。この問題を解決するには、切り捨てるのではなく、数値を丸めます。

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

(これは、数値が負ではないことを前提としています。)

ただし、ここでは整数を使用しており、浮動小数点演算はコストがかかるため、代わりにモジュロ演算子(整数を演算する)の使用を検討する必要があります。

int pickName = entryCount % 10;
于 2012-11-17T21:13:50.933 に答える