我确定我错过了一些东西,答案很简单,但我似乎无法理解为什么会这样。我正在尝试平均日期:
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,得到的结果相同。任何人都可以指出我正确的方向吗?
谢谢!
安东尼奥
答案 0 :(得分:2)
你是否有某种理由想与NSInteger捏造?
[NSDate timeIntervalSince1970]返回一个NSTimeInterval,它基本上是一个double。清理代码,看看是否有帮助。
答案 1 :(得分:1)
NSInteger可以保存最大为INT_MAX
限制的值,等于2147483647 - 因此您的值超出整数类型限制 - 请记住timeInterval是double类型。
您可以尝试在所有计算中使用double类型或使用-timeIntervalSinceReferenceDate
方法 - 它返回自1 January 2001
以来的间隔,您也可以避免溢出。
如果您的events
对象是一个允许获取其大小的数组或其他类型,那么您可以添加已经除以计数的时间间隔值 - 这也可能有助于避免溢出:
NSTimeInterval runningSum = 0;
NSInteger count = [self.events count];
for (...){
...
runningSum += [dateFromString timeIntervalSince1970]/count;
}
答案 2 :(得分:0)
NSInteger
是iPhone上的32位有符号整数,因此仅限于-2147483648和+2147483647之间的值。
您可以使用NSUInteger
获得所需的结果,{{1}}是一个无符号的32位整数,可以包含0到+4294967295之间的值。
但是,您应该注意循环中的运行次数,这样就不会包含值。