2010-05-26 14 views
0

我確定我錯過了一些東西,答案很簡單,但我似乎無法理解爲什麼會發生這種情況。我試圖讓日期的平均:兩個NSIntegers之和的值不正確

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)]); 
} 

一切似乎工作確定,除了運行總和+ =(NSInteger的)dateFromString timeIntervalSince1970],它給出了一個不正確的結果。如果我在取兩個相等日期的平均值(2009-10-10,例如,這是一個timeInterval爲1255125600)時設置了斷點,runningSum爲-1784716096,而不是預期的2510251200.

我試過了使用NSNumber和我得到相同的結果。任何人都可以指引我正確的方向嗎?

謝謝!

Antonio

回答

2

是否有某些原因令您對NSInteger充滿了疑慮?

[NSDate timeIntervalSince1970]返回一個NSTimeInterval,它基本上是一個雙精度型。清理代碼,看看是否有幫助。

+0

Doh!對不起,我現在感到羞怯。改變了一切,漂浮和漂亮的作品。 再次感謝... – Antonio 2010-05-26 09:25:11

1

NSInteger可以保存值高達INT_MAX的限制,等於2147483647 - 所以你的值溢出整數類型的限制 - 記住timeInterval是一個雙精度型。

您可以嘗試在所有計算中使用double類型,或者使用-timeIntervalSinceReferenceDate方法 - 它返回自1 January 2001開始的間隔,並且您也可以避免溢出。

如果您events對象是一個數組或其他類型的允許獲得它的大小,那麼你可以添加已經通過數劃分的時間間隔值 - 這也有助於避免溢出:

NSTimeInterval runningSum = 0; 
NSInteger count = [self.events count]; 
for (...){ 
... 
runningSum += [dateFromString timeIntervalSince1970]/count; 
} 
+0

真實,謝謝。改變了一切,以浮動。這是當你不退後時發生的事情。 – Antonio 2010-05-26 09:26:10

0

NSInteger是iPhone上的32位有符號整數,因此限制在-2147483648和+2147483647之間的值。

使用NSUInteger可以得到想要的結果,這是一個無符號的32位整數,能夠包含0到+4294967295之間的值。

但是,您應該注意循環中的運行次數,以便不包裝值。

相關問題