2014-10-31 87 views
0

的陣列我的NSNumber的陣列的總和(在此情況下,爲簡單起見我只有一個元素)精度的NSNumber

陣列是「_incassiInDistinta」包含一個對象「Incasso」具有屬性 「_importoIncassato」

enter image description here

現在,如果我用這個

double sum = [[_incassiInDistinta valueForKeyPath:@"@sum.importoIncassato"] doubleValue]; 

變量 「和」 我看好如下:

enter image description here

如果你用這種方法運行總和變量 「和」 即是這樣的:

NSArray *importi = [_incassiInDistinta valueForKeyPath:@"importoIncassato"]; 
__block double sum = 0; 
[importi enumerateObjectsUsingBlock:^(NSNumber *op, NSUInteger idx, BOOL *stop) { 
    sum = sum + [op doubleValue]; 
}]; 

enter image description here

如何獲取正確的價值觀? 感謝

編輯:

我不得不總和變量比較的,如果

如果(總和> = 1373.63).....

不起作用

+0

測試你的代碼。兩種方式我都得到了相同的結果。確保變量'_importoIncassato'被正確舍入。 – Kampai 2014-10-31 09:11:47

+0

_importoIncassato只有2個小數位(從數據庫中讀取的值並轉換爲nusumber) – 2014-10-31 09:15:02

回答

1

你差異僅僅是由於浮點值的二進制近似值,您的兩個結果之間大約1e-13就不用擔心了。一篇關於浮動表示的文章here

如果您確實需要精確的十進制數(例如貨幣),則可以使用NSDecimalNumber。但只有在真正需要的時候才使用它們,它們使一切變得更慢。

+0

錯誤,因爲在第一種情況下,我必須比較if變量中的總和變量if(sum> = 1373.63)... if( ....) 。 如果你需要精確的十進制值,使用NSDecimalNumber – 2014-10-31 09:09:00

+0

,我覺得NSDecimalNumber,即使這讓我很煩,因爲我在一個週期 – jbat100 2014-10-31 09:09:50

+0

感謝您的解釋不工作 – 2014-10-31 09:13:12

0

這是我用於上述問題的黑客攻擊。

double轉換爲NSString,最多舍入小數點後兩位。

然後再將其從NSString轉換爲double。這會給你你需要的結果。嘗試一下。

NSString *roundUp = [NSString stringWithFormat:@"%0.2f",sum]; 

double finalValue = [roundUp doubleValue]; 

double fixValue = 1373.63; 

if (finalValue == fixValue) { 
    NSLog(@"Both values are same"); 
} 
+0

這不會改變你的最終值不會是一個確切的十進制表示形式 – jbat100 2014-10-31 09:21:39

+0

是的事實。但是,當你比較兩個值時,它將起作用。 – Kampai 2014-10-31 09:23:27

+0

它可能,但NSDecimalNumber是有準確處理這個問題,更安全和優雅 – jbat100 2014-10-31 09:27:50