Бесконечность в расчете процентов? - PullRequest
0 голосов
/ 08 марта 2012

Благодаря Лоуренсу Бёрку в моем другом вопросе о функции isMaybeMoney я могу определить, является ли вход деньгами или нет.

То, что я сейчас делаю, пытается вычислить итоговую сумму после процентов, но я продолжаю выводить бесконечность на экран. Что в мире не так с моими интересами? Предполагается, что это будет 3522,55 долл. США, когда я использую 1234 долл. США в качестве начального баланса с долей 3,5%.

Может кто-нибудь помочь мне?

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;
}

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы умножаете итоговое значение на коэффициент каждого шага в цикле while, что кажется достаточно разумным, но вы также умножаете итоговое значение на значение переменной "money", которая, насколько я могу судить, является начальным балансом.1001 *

Таким образом, вы умножаете на начальный баланс 360 раз.Если бы только мои сберегательные счета работали так!Я не уверен, что остальная логика верна, но для начала попробуйте переместить

total = total * money;

под черту

float total = 1;

(или еще лучше простоизменить с

float total = 1;

на

float total = money;

и избавиться от линии

total = total * money;

в целом)

0 голосов
/ 10 марта 2012

Коды, которые у вас есть, не оцениваются. НЕТ ПРЕИМУЩЕСТВА конструкции цикла для расчета процентов! Это не является необходимым, но представляет большую опасность для высокого осложнения

Вот коды, которые вы хотите использовать для ФУНКЦИОНАЛЬНОЙ инкапсуляции:

    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); 
    } 

спасибо,

ПРАШАНТ:)

...