2014-10-31 2 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

Как получить правильные значения? благодаря

EDIT:

Я должен сравнить переменную сумму в

если

если (сумма> = 1373,63) .....

не работает

+0

Протестирован код. Я получил тот же результат для обоих способов. Убедитесь, что переменная '_importoIncassato' округлена правильно. – Kampai

+0

_importoIncassato имеет только 2 десятичных знака (значение, считанное из базы данных и преобразованное в номер) –

ответ

1

Ваш расхождение связано только с бинарными приближениями значений поплавка, около 1е-13 между двумя вашими результатами не беспокоиться об этом. Статья о плавающих представлениях here.

Если вам действительно нужны точные десятичные числа (например, для валюты), вы можете использовать NSDecimalNumber. Но используйте их только в случае необходимости, они делают все намного медленнее.

+0

неправильно, потому что в первом случае мне нужно сравнить переменную суммы в a, если if (sum> = 1373.63) .... не работает –

+0

Если вам нужны точные десятичные значения, используйте NSDecimalNumber – jbat100

+0

спасибо за ваше объяснение, я чувствую NSDecimalNumber, даже если это меня раздражает, потому что я в цикле –

0

Это хак, который я использовал для выпуска, как указано выше.

Преобразование double в NSString с округлением до двух десятичных знаков.

Затем снова преобразуйте его в double от NSString. Это даст вам результат, который вам нужен. Попробуй.

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

+0

Да. Но когда вы сравниваете оба двойных значения, это сработает. – Kampai

+0

Это может быть, но NSDecimalNumber должен обрабатывать именно эту проблему, более безопасно и элегантно. – jbat100

Смежные вопросы