2014-09-16 2 views
-4

Есть аналогичный ответ на мой вопрос, но ситуация не совсем такая. Однако я делаю калькулятор погашения кредита, но когда я запускаю эту итерацию, я получаю «NaN» независимо от того, какие числа я использую. Я не уверен, что моя математика ошибается или я злоупотребляю «Математикой». функция.Консоль продолжает давать мне NAN

int choice=1; 
    do{ 
     Console.WriteLine("1. Find out how many months it will take to pay off the loan: "); 
    Console.WriteLine("2. Can I afford it? "); 
    Console.WriteLine("3. Exit "); 

    choice = int.Parse(System.Console.ReadLine()); 
    if (choice == 1) 
    { 
     Console.WriteLine("Enter amount borrowed: "); 
     double borrowed = double.Parse(System.Console.ReadLine()); 
     Console.WriteLine("Enter the interest rate: "); 
     double rate = double.Parse(System.Console.ReadLine()); 
     Console.WriteLine("Enter monthly payment: "); 
     double monthly = double.Parse(System.Console.ReadLine()); 


     double answer = Math.Ceiling((Math.Log10(monthly)-Math.Log10(monthly-borrowed*rate))/(Math.Log10(1+rate/12))); 


     Console.WriteLine(answer); 
+3

Вы пробовали использовать отладчик? – clcto

+3

Консоль не «дает» NaN. Он просто печатает значение, предоставленное ему. Вернитесь назад и узнайте, где было введено NaN; затем задайте * конкретный * вопрос об этом, если он останется. Я бы рекомендовал разбить длинное выражение раньше; это поможет изолировать вопрос о том, где NaN (ы) были впервые введены. Имейте в виду, что NaN являются заразными и будут загрязнять всю дальнейшую математику. – user2864740

+0

Можете ли вы быть более конкретным. – user3980820

ответ

3

10 основанный логарифм не может быть рассчитан с отрицательного числа. Я предлагаю, чтобы этот вызов функции аннулировал ваш ответ как «Не номер» (NaN).

Math.Log10(monthly-borrowed*rate) 

С другой стороны, это все о вводе. Как отмечают комментаторы, используйте отладчик, чтобы выполнить свое приложение.

1

Вы Nan из Math.Log10(monthly - borrowed * rate))

интервал определения log10 является] 0, + ∞ [.

if(monthly - borrowed * rate) < 0 Функция log10 не определена.

Ваш alogorthm не очень хорошо.

позвольте сказать, что заимствовано = B, rate = r, ежемесячно = m и число месяцев = x.

если г является Anual скорости, и это было в процентах:

 Log(m) - Log(m - Br/12) 
x = --------------------------------- r is the percent (ex 0.01) 
        Log(1 + r/12) 

Я полагаю, что вы получите (м - Br/12) < 0, потому что вы забыли разделит г на 100

1

Если вы рефакторинга ваше сложное выражение на его составные части:

double borrowed = 20000.00  ; 
double rate  = 6.00/100.00 ; // 6% interest 
double monthly = 500.00  ; 

double monthlyLog10   = Math.Log10(monthly) ; 
double monthlyPrincipal  = monthly - borrowed * rate ; 
double monthlyPrincipalLog10 = Math.Log10(monthlyPrincipal) ; 
double mpr     = 1.0 + rate/12.0 ; 
double mprLog10    = Math.Log10(mpr ) ; 
double delta     = monthlyLog10 - monthlyPrincipalLog10 ; 
double result    = delta/mprLog10 ; 
double answer    = Math.Ceiling(result) ; 

вы обнаружите, что в этом случае, monthly - borrowed * rate работает -700.0. Затем вы обнаружите, что журнал (-700.00) ... NaN.

Следовательно, ваша проблема.

Если вы используете correct formula, вы увидите, что ваш код проще:

double amountBorrowed  = 20000.00   ; // A: the loan principal 
double monthlyInterestRate = (6.0/100.00)/12.0 ; // i: periodic interest rate (here, 6% per year/12 to get the monthly interest rate) 
double monthlyPayment  = 250.00    ; // P: periodic payment 
double totalNumberOfPayments = -Math.Log(1 - ((monthlyInterestRate*amountBorrowed)/monthlyPayment)) 
          /Math.Log(1+monthlyInterestRate) ; 
Смежные вопросы