2013-11-18 2 views
1

APP, который я пишу, должен делать некоторые финансовые расчеты, в основном это все о кредитах, дебетованиях и балансе. Единственная проблема (до сих пор) в том, что если я вычислил 999999999.99 - 0,00, результат будет 1000000000.00. Пожалуйста, кто-нибудь знает, почему это происходит? Вот мой код:iOS - Операции с двойными значениями

NSNumber *totalCredits; 
NSNumber *totalDebits; 
NSNumber *balance; 

self.credits = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
totalCredits = [self.credits valueForKeyPath:@"@sum.amount"]; 
double totalCreditsDouble = [totalCredits doubleValue]; 
self.creditLabel.text = [NSString stringWithFormat:@"%1.2f", totalCreditsDouble]; 

self.debits = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
totalDebits = [self.debits valueForKeyPath:@"@sum.amount"]; 
double totalDebitsDouble = [totalDebits doubleValue]; 
self.debitLabel.text = [NSString stringWithFormat:@"%1.2f", totalDebitsDouble]; 

balance = [NSNumber numberWithFloat:([totalCredits floatValue] - [totalDebits floatValue])]; 
double balanceDouble = [balance doubleValue]; 
self.balanceLabel.text = [NSString stringWithFormat:@"%1.2f", balanceDouble]; 

Все данные хранятся как Двойной.

+7

Использование 'double' (или' float') для хранения значений валюты - плохая идея, http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent- currency – Jack

ответ

2

Тип C double, как правило, не очень хорошо подходит для финансовых расчетов.

У фонда .framework есть хороший тип данных для этого: NSDecimalNumber. NSDecimalNumber использует десятичное представление и имеет 36 цифр точности.

+0

Вот и все, Николай и Джош, спасибо! Я также изменил сохраненные значения на десятичный. – Carlos

1

http://floating-point-gui.de/ - хороший ресурс для начала. Вы пытаетесь сохранить точные значения, используя тип данных, который не может представлять их с необходимой точностью или точностью.

Если целостность этих вычислений важна для вас, вам необходимо переключиться на сохранение этих значений в формате, который их точно представляет.

В этом случае простым решением может быть сохранение всех ваших валют в наименьшем возможном значении (например, центах) в виде целых чисел (при условии, что вам не нужны дробные центы и тщательно и последовательно обрабатывать любое подразделение).

+0

Николай прав, что 'NSDecimalNumber' будет лучшим выбором. – Jonah

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