C# 利息计算中的无穷大?

C# 利息计算中的无穷大?,c#,.net,currency,C#,.net,Currency,感谢Laurence Burke在我关于isMaybeMoney函数的另一个问题中的提问,我能够确定输入是否是钱 我现在要做的是计算利息后的总金额,但我一直在屏幕上写无穷大。我的兴趣函数到底出了什么问题?当我用1234美元作为起始余额,加上3.5%的利息时,应该是3522.55美元 有人能帮我吗 static float money; static void Main() { string[] myMaybeBalances = Accounts.GetStartingBalances

感谢Laurence Burke在我关于isMaybeMoney函数的另一个问题中的提问,我能够确定输入是否是钱

我现在要做的是计算利息后的总金额,但我一直在屏幕上写无穷大。我的兴趣函数到底出了什么问题?当我用1234美元作为起始余额,加上3.5%的利息时,应该是3522.55美元

有人能帮我吗

static float money;

static void Main()
{
    string[] myMaybeBalances = Accounts.GetStartingBalances();

    myIsMaybeMoneyValidator Miimv = new myIsMaybeMoneyValidator();

    ArrayList interests = Miimv.interestsAccrued(myMaybeBalances);
    foreach (object interest in interests)
    {
        Console.WriteLine(interest);
    }

    Console.ReadLine();
}

public ArrayList interestsAccrued(string[] myMaybeBalances)
{
    ArrayList interests = new ArrayList();
    foreach (string myMaybeBalance in myMaybeBalances)
    {
        bool myResult = isMaybeMoney(myMaybeBalance);
        if (myResult == true)
        {
            decimal[] rates = Accounts.GetRates();

            for (int i = 0; i < rates.Length; i++)
            {
                decimal rate = rates[i];
                float total = 1;

                int n_X_t = 360;
                while (n_X_t != 0)
                {
                    rate = (1 + rates[i] / 12);
                    float myRate;
                    float.TryParse(rate.ToString(), out myRate);

                    total = total * myRate;
                    total = total * money;
                    n_X_t = n_X_t - 1;
                }
                interests.Add(total);
            }
        }
    }
    return interests;
}

public bool isMaybeMoney(object theirMaybeMoney)
{
    string myMaybeMoney = theirMaybeMoney.ToString();

    float num;
    bool isValid = float.TryParse(myMaybeMoney,
    NumberStyles.Currency,
    CultureInfo.GetCultureInfo("en-US"), // cached
    out num);

    money = num;
    return isValid;
}
静态浮动货币;
静态void Main()
{
字符串[]MyMaybeBealements=Accounts.GetStartingBalances();
myIsMaybeMoneyValidator Miimv=新的myIsMaybeMoneyValidator();
ArrayList利息=百万元利息(百万元余额);
foreach(权益中的对象权益)
{
控制台。写线(利息);
}
Console.ReadLine();
}
已确认的公共阵列列表权益(字符串[]MyMaybebeBalances)
{
ArrayList兴趣=新建ArrayList();
foreach(mymaybebeals中的字符串mymaybeals)
{
bool myResult=isMaybeMoney(mymaybebeance);
if(myResult==true)
{
十进制[]比率=Accounts.GetRates();
for(int i=0;i
您将总计乘以while循环中每一步的速率,这似乎足够合理,但您也将总计乘以变量“money”的值,据我所知,这是起始余额

所以你乘以起始平衡360倍。要是我的储蓄账户能像那样工作就好了!我不确定其余的逻辑是否正确,但首先,请尝试移动

total = total * money;
下线

float total = 1;
(或者更好的做法是从

float total = 1;

把电话线给我

total = total * money;

总的来说)

您拥有的代码无法计算。构造循环对利息计算没有好处! 这是不必要的,但会带来很多高并发症的风险

以下是您想要使用函数封装的代码:

    static void Main() 
    { 
        var interests = new List<decimal>(); 

        foreach (string possibleBalance in Accounts.GetStartingBalances()) 
        foreach (decimal rate in Accounts.GetRates()) 
        { 
            decimal balance; 
            if (!decimal.TryParse(possibleBalance, NumberStyles.Currency, CultureInfo.CurrentCulture, out balance))  
                continue; 

            decimal interest = CalculateInterestAccrued(balance, rate, 12, 30); 
            interests.Add(interest); 
        } 

        foreach (decimal interest in interests) 
            Console.WriteLine(interest); 

        Console.ReadKey(); 
    } 

    static decimal CalculateInterestAccrued(decimal principal, decimal rate, int compoundsPerYear, int years) 
    { 
        return principal * (decimal)Math.Pow((double)(1 + rate / compoundsPerYear), compoundsPerYear * years); 
    } 
static void Main()
{ 
var利息=新列表();
foreach(Accounts.GetStartingBalances()中的字符串可能平衡)
foreach(Accounts.GetRates()中的十进制比率)
{ 
十进制余额;
if(!decimal.TryParse(可能的平衡,numberstyle.Currency,CultureInfo.CurrentCulture,out balance))
继续;
十进制利息=计算利息(余额、利率、12、30);
利息。加上(利息);
} 
foreach(利息中的小数利息)
控制台。写线(利息);
Console.ReadKey();
} 
静态十进制计算利息(十进制本金、十进制利率、整数复合年数、整数年数)
{ 
返回本金*(十进制)数学功率((双倍)(1+利率/复合年),复合年*年);
} 
谢谢


PRASHANT:)

为什么你总是在浮点和十进制之间转换?Float不适用于数值计算-将其删除。(为什么不使用.NET命名约定或泛型类型?)?费率[0]的值是多少?@JonSkeet float用于小数点后的数字,我在这里处理钱的问题,所以我必须使用它-谢谢你的建议!你是什么意思?我没有得到任何错误或任何东西。@RagingDave:“float表示小数点后的数字”-没有。float/double通常最适合用于自然出现的值,这些值实际上没有精确可测量的值;其中大小很重要,但十进制表示并不重要
decimal
适用于货币等具有精确值的人工值。有关更多信息,请参阅和。对于.NET命名约定,请阅读@Jon Skeet提到的。。。花些时间学习标准C#编码约定可能会对你有好处,这样你的变量命名等可以让你的代码更容易被其他人理解。也可以只使用十进制类型,它非常适合金融计算等,因为它不会受到浮点计算固有的不精确性的影响(即使用浮点或双变量时)。
    static void Main() 
    { 
        var interests = new List<decimal>(); 

        foreach (string possibleBalance in Accounts.GetStartingBalances()) 
        foreach (decimal rate in Accounts.GetRates()) 
        { 
            decimal balance; 
            if (!decimal.TryParse(possibleBalance, NumberStyles.Currency, CultureInfo.CurrentCulture, out balance))  
                continue; 

            decimal interest = CalculateInterestAccrued(balance, rate, 12, 30); 
            interests.Add(interest); 
        } 

        foreach (decimal interest in interests) 
            Console.WriteLine(interest); 

        Console.ReadKey(); 
    } 

    static decimal CalculateInterestAccrued(decimal principal, decimal rate, int compoundsPerYear, int years) 
    { 
        return principal * (decimal)Math.Pow((double)(1 + rate / compoundsPerYear), compoundsPerYear * years); 
    }