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],它给出了不正确的结果。如果我在取两个相等日期的平均值时放置一个断点(例如,2009-10-10,它的 timeInterval 为 1255125600),runningSum 为 -1784716096,而不是预期的 2510251200。

我试过使用 NSNumber 并且得到相同的结果。谁能指出我正确的方向?

谢谢!

安东尼奥

4

3 回答 3

2

你有什么理由对 NSInteger 捏造吗?

[NSDate timeIntervalSince1970] 返回一个 NSTimeInterval,它基本上是一个 double。清理代码,看看是否有帮助。

于 2010-05-26T09:15:07.807 回答
1

NSInteger 可以将值保存到INT_MAX等于 2147483647 的限制 - 因此您的值会溢出整数类型限制 - 请记住 timeInterval 是双精度类型。

您可以尝试在所有计算或使用-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

NSInteger在 iPhone 上是一个 32 位有符号整数,因此限制在 -2147483648 和 +2147483647 之间的值。

您可以通过使用 which 获得所需的结果,NSUInteger它是一个无符号 32 位整数,能够包含 0 到 +4294967295 之间的值。

You should however pay attention to the number of runs through the loop so you don't wrap the values.

于 2010-05-26T09:15:53.560 回答