2015-11-06 108 views
-3

我的程序应该显示需要多少个月才能偿还债务。我的问题是,当我把代码解决了需要多长时间来偿还债务的方法,我的价值回到了负面。我的公式代码是正确的,其他所有功能都正常运行,只是当我声明CreditCardMonths() 来解决问题时,无论我的输入是什么,我总是得到-2763737号码。C#方法返回值错误负数

这里是我的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DebtCalculator 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      char menuItem; 
      Console.WriteLine("Welcome to the credit card balance payoff calculator"); 
      Console.WriteLine(); 
      intro(); 
      CreditCardMonths(); 

      displaymenu(); 
      menuItem = GetUpperCaseYN(); 
      while (menuItem != 'N') 
      { 
       ProcessMenuItem(menuItem); 
       menuItem = GetUpperCaseYN(); 
      } 
      Console.WriteLine("Thank you, goodbye."); 
      Console.ReadKey(); 
     } 

     static void intro() 
     { 
      double creditcardbalance; 
      creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance"); 

      double monthlypayementamount; 
      monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount"); 

      decimal percentagerate; 
      percentagerate = GetPositiveDecimal("Enter In Percentage Rate"); 
     } 

     static void CreditCardMonths() 
     { 
      double dailyinterestrate; 
      double payoff; 
      double creditcardbalance = 0; 
      double monthlypayementamount = 0; 
      decimal percentagerate = 0; 

      dailyinterestrate = (double)percentagerate/365; 
      payoff = (int)(-(1d/30) * Math.Log(1 + creditcardbalance/monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30)))/Math.Log(1 + dailyinterestrate)) + 1; 

      Console.WriteLine("It will take {0} months to pay off debt",payoff); 
     } 

     //} 

     static decimal GetPositiveDecimal(string message) 
     { 
      decimal value; 
      Console.WriteLine(message); 
      value = decimal.Parse(Console.ReadLine()); 
      while (value <= 0) 
      { 
       Console.WriteLine("invalid input. Please enter a non negative Decimal"); 
       Console.WriteLine(message); 
       value = decimal.Parse(Console.ReadLine()); 
      } 
      return value; 
     } 
     static double GetPositiveDouble(string message) 
     { 
      double value; 
      Console.WriteLine(message); 
      value = double.Parse(Console.ReadLine()); 
      while (value <= 0) 
      { 
       Console.WriteLine("Invalid Input . Enter In A Non Negative Number"); 
       Console.WriteLine(message); 
       value = double.Parse(Console.ReadLine()); 
      } 
      return value; 
     } 

     static char GetUpperCaseYN() 
     { 
      char menuItem; 
      menuItem = char.Parse(Console.ReadLine()); 
      menuItem = char.ToUpper(menuItem); 
      while (menuItem != 'Y' && menuItem != 'N') 
      { 
       Console.WriteLine("Invalid Menu Item"); 
       menuItem = char.Parse(Console.ReadLine()); 
       menuItem = char.ToUpper(menuItem); 
      } 
      return menuItem; 
     } 
     static void displaymenu() 
     { 
      Console.WriteLine("Calculate Another? (Y/N)"); 
     } 

     static void ProcessMenuItem(char menuItem) 
     { 
      switch (menuItem) 
      { 
       case 'Y': 
        intro(); 

        displaymenu(); 
        break; 
      } 
     } 
    } 
} 
+0

请提供一个简洁的程序来重现您的问题。 [如何提出一个好问题](http://stackoverflow.com/help/how-to-ask) –

回答

0

的问题是,该方法没有您键入的值的想法

static void intro() 
    { 
     double creditcardbalance; 
     creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance"); 

     double monthlypayementamount; 
     monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount"); 

     decimal percentagerate; 
     percentagerate = GetPositiveDecimal("Enter In Percentage Rate"); 

     // Everything available until here! 
    } 

    static void CreditCardMonths() 
    { 

     double dailyinterestrate; 
     double payoff; 
     double creditcardbalance = 0; 
     double monthlypayementamount = 0; 
     decimal percentagerate = 0; 

     // values set to what you wrote above (0) 

     dailyinterestrate = (double)percentagerate/365; 
     payoff = (int)(-(1d/30) * Math.Log(1 + creditcardbalance/monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30)))/Math.Log(1 + dailyinterestrate)) + 1; 

     Console.WriteLine("It will take {0} months to pay off debt",payoff); 

    } 

你可能。通过将这些变量放在方法之外(全局变量)或将值作为参数传递来解决这个问题。

下面是使用全局变量时的样子。

static double creditcardbalance; 
// your variables..  

static void Main(string[] args) 
{ 
    // Call your methods 
} 

static void intro() 
{ 
     creditcardbalance = GetPositiveDouble("Enter In Credit Card Balance"); 
     monthlypayementamount = GetPositiveDouble("Enter In Monthly Payement Amount"); 
     percentagerate = GetPositiveDecimal("Enter In Percentage Rate"); 
} 
static 
    ... // your methods 

如果您愿意使用参数(我通常做的),它看起来就像是: (例如)

static void Main(string[] args) 
{ 
    //call your methods 
} 

static void CreditCardMonths(double creditcardbalance, double monthlypayementamount, decimal percentagerate) 
{ 

     double dailyinterestrate; 
     double payoff; 

     dailyinterestrate = (double)percentagerate/365; 
     payoff = (int)(-(1d/30) * Math.Log(1 + creditcardbalance/monthlypayementamount * (1 - Math.Pow(1 + dailyinterestrate, 30)))/Math.Log(1 + dailyinterestrate)) + 1; 

     Console.WriteLine("It will take {0} months to pay off debt",payoff); 

    } 

    //Call it like CreditCardMonths(yourValue0, yourValue1, yourValue2); 

0

你得到相同的结果的原因,所有的时间,因为你重新声明变量

double creditcardbalance = 0; 
double monthlypayementamount = 0; 
decimal percentagerate = 0; 

您必须传递这些值,并从使用和设置它们的各种方法。