0

私は何かが欠けていると確信しており、答えは非常に簡単ですが、なぜこれが起こっているのか理解できないようです. 私は日付の平均を作ろうとしています:

NSInteger runningSum =0;
NSInteger count=0;
for (EventoData *event in self.events) {
    NSDate *dateFromString = [[NSDate alloc] init];
    if (event.date != nil) {
        dateFromString = [dateFormatter dateFromString:event.date];
        runningSum += (NSInteger)[dateFromString timeIntervalSince1970];
        count += 1;
    }
}
if (count>0) {
    NSLog(@"average is: %@",[NSDate dateWithTimeIntervalSince1970:(NSInteger)((CGFloat)runningAverage/count)]);
}

runningSum += (NSInteger)[dateFromString timeIntervalSince1970] を除いて、すべて正常に動作しているように見えますが、これは正しくない結果をもたらします。2 つの等しい日付 (たとえば、1255125600 の timeInterval である 2009-10-10) の平均をとるときにブレークポイントを設定すると、runningSum は予想される 2510251200 ではなく、-1784716096 になります。

NSNumber を使用してみましたが、同じ結果が得られました。誰かが私を正しい方向に向けることができますか?

ありがとう!

アントニオ

4

3 に答える 3

2

NSInteger をいじっている理由はありますか?

[NSDate timeIntervalSince1970] は、基本的に double である NSTimeInterval を返します。コードをクリーンアップして、それが役立つかどうかを確認してください。

于 2010-05-26T09:15:07.807 に答える
1

NSIntegerINT_MAXは 2147483647 に等しい制限まで値を保持できるため、値は整数型の制限を超えます。timeInterval は double 型であることを思い出してください。

すべての計算で double 型を使用するか、-timeIntervalSinceReferenceDateメソッドを使用してみてください1 January 2001

オブジェクトが配列またはそのサイズを取得できるその他の型である場合eventsは、既にカウントで分割されている時間間隔の値を追加できます。これは、オーバーフローを回避するのにも役立ちます。

NSTimeInterval runningSum = 0;
NSInteger count = [self.events count];
for (...){
...
runningSum += [dateFromString timeIntervalSince1970]/count;
}
于 2010-05-26T09:15:21.660 に答える
0

NSIntegeriPhone では 32 ビットの符号付き整数であるため、-2147483648 から +2147483647 までの値に制限されます。

NSUInteger0 ~ +4294967295 の値を含むことができる符号なし 32 ビット整数である which を使用して、目的の結果を得ることができます。

ただし、値をラップしないように、ループの実行回数に注意する必要があります。

于 2010-05-26T09:15:53.560 に答える