2011-10-18 28 views
0

我正在製作一個處理計算金錢的應用程序,並且已經閱讀了它總是最好使用NSNumber的。所以我已經將我的浮點值更改爲NSNumber,但是現在我得到了下面的奇怪結果,我不知道它爲什麼會發生。爲什麼這個NSNumber總和會丟回一個奇怪的結果?

這是代碼:

- (NSDecimalNumber*) subtotal { 
    NSDecimalNumber *subtotal = [NSDecimalNumber decimalNumberWithString:@"0"]; 
    NSLog(@"subtotal initially set at %@",subtotal); 
    for (NSManagedObject *object in [fetchedResultsController fetchedObjects]) { 
     NSLog(@"Looping"); 
     NSDecimalNumber *objectRowTotalNumber = [object valueForKey:@"total"]; 
     NSLog(@"object row total number = %@",objectRowTotalNumber); 
     subtotal = [subtotal decimalNumberByAdding:objectRowTotalNumber]; 

     NSLog(@"Subtotal: %@", subtotal); 
    } 

    return 0; 
} 

這是日誌輸出:

**2011-10-19 09:27:19.289 Market[4240:b603] subtotal initially set at 0** 

**2011-10-19 09:27:19.290 Market[4240:b603] Looping** 

**2011-10-19 09:27:19.291 Market[4240:b603] object row total number = 5** 

**2011-10-19 09:27:19.292 Market[4240:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244200806570181766106054656** 

會有人知道是什麼原因造成的奇結果時,小計應簡單設置爲5?

最新測試:本NSDecimalNumberMethod只適用於我在會話中添加新的對象,而不是在被加載

-(void) viewDidAppear:(BOOL)animated { 
NSLog(@"I'm in ViewDidAppear"); 
// Reload subtotal via float method 
[self subtotal]; 
//Reload subtotal via decimal method 
[self subtotalDec]; 
} 

對象與浮法

-(float) subtotal { 
NSLog(@"I'm in subtotal using floats"); 

float subtotal = 0; 
NSLog(@"subtotal initially set at %@",subtotal); 
for (NSManagedObject *object in [fetchedResultsController fetchedObjects]) { 
NSLog(@"Looping"); 
NSNumber *objectRowTotalNumber = [object valueForKey:@"total"]; 
NSLog(@"object row total number = %@",objectRowTotalNumber); 
float objectRowTotal = [objectRowTotalNumber floatValue]; 
subtotal = subtotal + objectRowTotal; 
} 
NSLog(@"Subtotal: %f", subtotal); 
return 0; 
} 

與計算計算NSDecimal號碼方法

- (NSDecimalNumber*) subtotalDec { 
NSLog(@"I'm in subtotal using NSDecimalNumber"); 
NSDecimalNumber *subtotal = [NSDecimalNumber decimalNumberWithString:@"0"]; 
NSLog(@"subtotal initially set at %@",subtotal); 
for (NSManagedObject *object in [fetchedResultsController fetchedObjects]) { 
NSLog(@"Looping"); 
NSDecimalNumber *objectRowTotalNumber = [object valueForKey:@"total"]; 
NSLog(@"object row total number = %@",objectRowTotalNumber); 
subtotal = [subtotal decimalNumberByAdding:objectRowTotalNumber]; 
} 
NSLog(@"Subtotal: %@",subtotal); 
return 0; 
} 

日誌視圖會出現

2011-10-19 11:19:01.506 Market[961:b603] I'm in ViewDidAppear 
2011-10-19 11:19:01.506 Market[961:b603] I'm in subtotal using floats 
2011-10-19 11:19:01.507 Market[961:b603] subtotal initially set at (null) 
2011-10-19 11:19:01.508 Market[961:b603] Looping 
2011-10-19 11:19:01.508 Market[961:b603] object row total number = 4 
2011-10-19 11:19:01.509 Market[961:b603] Looping 
2011-10-19 11:19:01.509 Market[961:b603] object row total number = 1 
2011-10-19 11:19:01.509 Market[961:b603] Looping 
2011-10-19 11:19:01.510 Market[961:b603] object row total number = 10 
2011-10-19 11:19:01.510 Market[961:b603] Subtotal: 15.000000 
2011-10-19 11:19:01.510 Market[961:b603] I'm in subtotal using NSDecimalNumber 
2011-10-19 11:19:01.511 Market[961:b603] subtotal initially set at 0 
2011-10-19 11:19:01.511 Market[961:b603] Looping 
2011-10-19 11:19:01.511 Market[961:b603] object row total number = 4 
2011-10-19 11:19:01.512 Market[961:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244200806569055866199212032 
2011-10-19 11:19:01.512 Market[961:b603] Looping 
2011-10-19 11:19:01.512 Market[961:b603] object row total number = 1 
2011-10-19 11:19:01.513 Market[961:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000488401613129104533143683072 
2011-10-19 11:19:01.513 Market[961:b603] Looping 
2011-10-19 11:19:01.513 Market[961:b603] object row total number = 10 
2011-10-19 11:19:01.514 Market[961:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000732602419703789898877108224 

日誌addbuttontapped:注意NSDecimalNumberMethod如何工作只能在最後的附加價值,而不是在程序啓動

2011-10-20 07:17:03.218 Market[2199:b603] I'm in subtotal using floats 
2011-10-20 07:17:03.218 Market[2199:b603] subtotal initially set at (null) 
2011-10-20 07:17:03.219 Market[2199:b603] Looping 
2011-10-20 07:17:03.219 Market[2199:b603] object row total number = 4 
2011-10-20 07:17:03.219 Market[2199:b603] Looping 
2011-10-20 07:17:03.219 Market[2199:b603] object row total number = 1 
2011-10-20 07:17:03.220 Market[2199:b603] Looping 
2011-10-20 07:17:03.220 Market[2199:b603] object row total number = 10 
2011-10-20 07:17:03.220 Market[2199:b603] Looping 
2011-10-20 07:17:03.221 Market[2199:b603] object row total number = 2 
2011-10-20 07:17:03.221 Market[2199:b603] Subtotal: 17.000000 
2011-10-20 07:17:03.221 Market[2199:b603] I'm in subtotal using NSDecimalNumber 
2011-10-20 07:17:03.222 Market[2199:b603] subtotal initially set at 0 
2011-10-20 07:17:03.222 Market[2199:b603] Looping 
2011-10-20 07:17:03.222 Market[2199:b603] object row total number = 4 
2011-10-20 07:17:03.223 Market[2199:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244200806569055866199212032 
2011-10-20 07:17:03.223 Market[2199:b603] Looping 
2011-10-20 07:17:03.224 Market[2199:b603] object row total number = 1 
2011-10-20 07:17:03.224 Market[2199:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000488401613129104533143683072 
2011-10-20 07:17:03.224 Market[2199:b603] Looping 
2011-10-20 07:17:03.225 Market[2199:b603] object row total number = 10 
2011-10-20 07:17:03.225 Market[2199:b603] Subtotal: -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000732602419703789898877108224 
2011-10-20 07:17:03.225 Market[2199:b603] Looping 
2011-10-20 07:17:03.226 Market[2199:b603] object row total number = 2 
2011-10-20 07:17:03.226 Market[2199:b603] Subtotal: 2 
+2

可能重複:http://stackoverflow.com/questions/3897042/adding-nsdecimalnumbers-not-quite-working – Wolfert

+2

有你,如果'檢查[對象valueForKey:@ 「總」]'是給你回一個'NSDecimalNumber'? – Orangenhain

+0

是的,這是解決方案!儘管根據我的對象模型總數被指定爲NSDecimalNumber。我不小心餵了一個NSNumber。謝謝!! @Orangenhain – msec

回答

0

爲了讓它起作用,我不得不在代碼中添加兩行代碼。這是我必須做的。

- (NSDecimalNumber*) subtotalDec { 
NSLog(@"I'm in subtotal using NSDecimalNumber"); 
NSDecimalNumber *subtotal = [NSDecimalNumber decimalNumberWithString:@"0"]; 
NSLog(@"subtotal initially set at %@",subtotal); 
for (NSManagedObject *object in [fetchedResultsController fetchedObjects]) { 
NSLog(@"Looping"); 
NSDecimalNumber *objectRowTotalNumber = [object valueForKey:@"total"]; 
NSLog(@"object row total number = %@",objectRowTotalNumber); 
//This is the start of added code 
NSString *objectRowString = [NSString stringWithFormat:@"%@",objectRowTotalNumber]; 
NSDecimalNumber *objectRowTotal = [NSDecimalNumber decimalNumberWithString:objectRowString]; 
//This is the end of added code 
subtotal = [subtotal decimalNumberByAdding:objectRowTotal]; 

NSLog(@"Subtotal: %@",subtotal); 

} 
3

我不前中輸入的那些不認爲[object valueForKey:@"total"]是給你一個NSDecimalNumber,而是NSNumber

更新:

顯然這是正確的方向。因此,請取消刪除帖子,以便我們可以有一個正確回答的問題。

我刪除了這個,因爲在寫完之後,我試着用一個NSNumber嘗試decimalNumberByAdding:,它崩潰了。但是這是在OSX 10.7 SDK項目中,所以顯然這在iOS中得到了不同的處理。

+0

其實我現在認爲問題不是來自那裏。當我在我的按鈕按下的方法中調用'[self subtotal]'時,它的工作原理就一定程度上......它包含了我在該會話中添加的值,用於表示這種方式,而不是已經存在並顯示在桌子也是。當'[self subtotal]'在ViewWillAppear中被調用時,我得到的結果就像你在'Subtotal:-0'上面看到的那樣。00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000244200806570181766106054656'有趣的是,它只是當我與浮動設置 – msec

+0

工作我已經編輯我的初始帖子與一些更多的信息根據我所經歷的 – msec

相關問題