C#方法返回值错误负数
问题描述:
我的程序应该显示需要多少个月才能偿还债务。我的问题是,当我把代码解决了需要多长时间来偿还债务的方法,我的价值回到了负面。我的公式代码是正确的,其他所有功能都正常运行,只是当我声明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;
}
}
}
}
答
的问题是,该方法没有您键入的值的想法
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);
答
你得到相同的结果的原因,所有的时间,因为你重新声明变量
double creditcardbalance = 0;
double monthlypayementamount = 0;
decimal percentagerate = 0;
您必须传递这些值,并从使用和设置它们的各种方法。
请提供一个简洁的程序来重现您的问题。 [如何提出一个好问题](http://stackoverflow.com/help/how-to-ask) –