2012-03-15 2 views
1

Эй, я пытаюсь рассчитать ежемесячные выплаты на основе суммы кредита, процентной ставки и количества лет.Как рассчитать погашение кредита

У меня появилось следующее, однако, похоже, разница между моими расчетами и другими калькуляторами займов в Интернете. мои данные теста составляли сумму кредита в размере 1000 долларов США, 5 процентов - в течение 1 года. это дает мне ежемесячный платеж в размере 85,61 и общую сумму 1027,29

Вот код, который вычисляет это.

double LoanAmount = la; //loan amount 
    double InterestRate = ir; //interest rate 
    double NumberOfYears = noy; //number of years 

    double interestRateDecimal = InterestRate/(12 * 100); 
    double months = NumberOfYears * 12; 
    double rPower = pow(1+interestRateDecimal,months); 

    monthlyPayments = LoanAmount * interestRateDecimal * rPower/(rPower - 1); 
    totalPayments = monthlyPayments * months; 
    yearlyPayments = monthlyPayments * 12; 
    totalInterest = totalPayments - LoanAmount; 

Является ли формула я использую правильно или есть ошибки?

Любая помощь будет оценена по достоинству.

Большое спасибо

+5

Прежде всего: не используйте двойной, если кто-то платит за этот кредит в реальной жизни. Используйте [NSDecimalNumber] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/Reference/Reference.html) См. [Вопрос «Должен ли я использовать NSDecimalNumber для работы с деньги? »] (http://stackoverflow.com/questions/421463/should-i-use-nsdecimalnumber-to-deal-with-money) по причинам –

+0

спасибо за отзыв, я посмотрю на это. Кстати, какая разница? как в том, что произойдет, если кто-то заплатит за этот кредит в реальной жизни. – user1214037

+1

@ пользователь1214037: разница в точности. Нужно ** НИКОГДА не использовать переменную float в приложении, которая занимается финансами. Вы всегда используете своего рода целое число для наименьшего количества денег в валюте, с которой работаете. Вы можете преобразовать только float при отображении конечного результата. –

ответ

-1

Вот как вы должны рассчитать свой ежемесячный платеж.

NSDecimalNumber monthlyPayment = LoanAmount * interestRateDecimal/(1 - (pow(1/(1 + interestRateDecimal), months))); 

Предлагаю также использовать NSDecimalNumbers.

+0

Спасибо, я посмотрю, как я могу использовать NSDecimalNumber, я довольно новичок в объективе c, поэтому я действительно не знаю всего, что доступно, но я понемногу узнаю. :) – user1214037

+0

Рад, что я мог помочь. Если это правильный ответ, вы можете пометить его как правильный ответ :) –

+0

Я немного посмотрел в NSDecimalNumber, но я не могу передавать парные числа в NSNumber (например, в коде, который вы предоставили), поэтому мне нужно перейти и преобразовать все мой удваивается в NSDecimalNumber? возможно ли выполнять вычисления, как в коде, который вы указали? - Также он дает мне ошибку: тип интерфейса не может быть статически распределен. – user1214037

3

Мне было немного скучно, поэтому я поместил формулу месячной ставки, которую я получил от internet, в код, который использует NSDecimalNumber.

Как вы увидите, это большая лаваш, чтобы использовать NSDecimalNumbers. Но вы пишете финансовое программное обеспечение, и ваши клиенты ожидают, что результаты верны.
И еще раз, я указываю вас на Маркуса Сарраса статью DON’T BE LAZY WITH NSDECIMALNUMBER (LIKE ME).

наслаждаться.

NSDecimalNumber *loan = [NSDecimalNumber decimalNumberWithString:@"25000"]; 
NSDecimalNumber *annualInterestRate = [NSDecimalNumber decimalNumberWithString:@"6"]; // 6% 
annualInterestRate = [annualInterestRate decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"100"]]; // 0.06 i.e. 6% 
NSInteger numberOfPayments = 36; 

// (loan * (interest/12))/(1 - (1 + interest/12)^-number) 
//   ^^^^^^^^^^^^^ temp1 
// ^^^^^^^^^^^^^^^^^^^^^^^^ temp2 
//          ^^^^^^^^^^^^^ temp1 
//         ^^^^^^^^^^^^^^^^^^^ temp4 
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temp5 
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temp6 
NSDecimalNumber *temp1 = [annualInterestRate decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"12"]]; 
NSDecimalNumber *temp2 = [temp1 decimalNumberByMultiplyingBy:loan]; 
NSDecimalNumber *temp4 = [[NSDecimalNumber one] decimalNumberByAdding:temp1]; 
NSDecimalNumber *temp5 = [[NSDecimalNumber one] decimalNumberByDividingBy:[temp4 decimalNumberByRaisingToPower:numberOfPayments]]; 
NSDecimalNumber *temp6 = [[NSDecimalNumber one] decimalNumberBySubtracting:temp5]; 

NSDecimalNumber *monthlyRate = [temp2 decimalNumberByDividingBy:temp6]; 
NSLog(@"Monthly rate: %@", monthlyRate); 

надеюсь, что это правильно. Обычно мне не приходится иметь дело с NSDecimalNumbers.

+0

большое спасибо за усилия, я попробую это – user1214037