-5

Is there a way to simplify this Switch statement? Should I use a loop or is this the way should be?

public static void Calculate(float invested, float years, float interest)
{
    float interestRate;

    interestRate = interest / 100 * invested; // % of invested * 1.

    switch (years)
    {
        case 1: Console.WriteLine("Your return = R {0}", invested + interestRate * 1); break;
        case 2: Console.WriteLine("Your return = R {0}", invested + interestRate * 2); break;
        case 3: Console.WriteLine("Your return = R {0}", invested + interestRate * 3); break;
        case 4: Console.WriteLine("Your return = R {0}", invested + interestRate * 4); break;
        case 5: Console.WriteLine("Your return = R {0}", invested + interestRate * 5); break;
        case 6: Console.WriteLine("Your return = R {0}", invested + interestRate * 6); break;
        case 7: Console.WriteLine("Your return = R {0}", invested + interestRate * 7); break;
        case 8: Console.WriteLine("Your return = R {0}", invested + interestRate * 8); break;
        case 9: Console.WriteLine("Your return = R {0}", invested + interestRate * 9); break;
        case 10: Console.WriteLine("Your return = R {0}", invested + interestRate * 10); break;
        case 11: Console.WriteLine("Your return = R {0}", invested + interestRate * 11); break;
        case 12: Console.WriteLine("Your return = R {0}", invested + interestRate * 12); break;
        case 13: Console.WriteLine("Your return = R {0}", invested + interestRate * 13); break;
        case 14: Console.WriteLine("Your return = R {0}", invested + interestRate * 14); break;
        case 15: Console.WriteLine("Your return = R {0}", invested + interestRate * 15); break;
        case 16: Console.WriteLine("Your return = R {0}", invested + interestRate * 16); break;
        case 17: Console.WriteLine("Your return = R {0}", invested + interestRate * 17); break;
        case 18: Console.WriteLine("Your return = R {0}", invested + interestRate * 18); break;
        case 19: Console.WriteLine("Your return = R {0}", invested + interestRate * 19); break;
        case 20: Console.WriteLine("Your return = R {0}", invested + interestRate * 20); break;
        case 21: Console.WriteLine("Your return = R {0}", invested + interestRate * 21); break;
        case 22: Console.WriteLine("Your return = R {0}", invested + interestRate * 22); break;
        case 23: Console.WriteLine("Your return = R {0}", invested + interestRate * 23); break;
        case 24: Console.WriteLine("Your return = R {0}", invested + interestRate * 24); break;
        case 25: Console.WriteLine("Your return = R {0}", invested + interestRate * 25); break;
        case 26: Console.WriteLine("Your return = R {0}", invested + interestRate * 26); break;
        case 27: Console.WriteLine("Your return = R {0}", invested + interestRate * 27); break;
        case 28: Console.WriteLine("Your return = R {0}", invested + interestRate * 28); break;
        case 29: Console.WriteLine("Your return = R {0}", invested + interestRate * 29); break;
        case 30: Console.WriteLine("Your return = R {0}", invested + interestRate * 30); break;        
    }
}
thatguy
  • 21,059
  • 6
  • 30
  • 40
Mario
  • 1
  • 9
    without a `switch`? `Console.WriteLine("Your return = R {0}", invested + interestRate * years); ` – MakePeaceGreatAgain Jul 08 '20 at 10:49
  • On top of @HimBromBeere's answer, if you only need 1-30 then use if to check the value – Cuppyzh Jul 08 '20 at 10:50
  • 2
    Unrelated: _do not use floating point types for monetary amounts_. https://stackoverflow.com/a/3730040/982149 – Fildor Jul 08 '20 at 10:58
  • 2
    Btw.: as `years` is a `float`, your switch might not even work in all cases. Shouldn't `years` be an `int`? – Olivier Jacot-Descombes Jul 08 '20 at 11:06
  • 1
    I'd also suggest - since the method's name is `Calculate` - it should _return_ the computed value and the caller should decide what to do with it (e.g. write it to Console). That way, you could unit test the function to make sure it produces the results you expect it to. – Fildor Jul 08 '20 at 11:11

4 Answers4

2
interestRate = interest / 100 * invested;
Console.WriteLine("Your return = R {0}", invested + interestRate * years);
canton7
  • 37,633
  • 3
  • 64
  • 77
Eren G.
  • 455
  • 1
  • 5
  • 14
2

This shall work just fine.

interestRate = interest / 100 * invested; // % of invested * 1.
Console.WriteLine("Your return = R {0}", invested + interestRate * years);
Jasmeet
  • 1,315
  • 11
  • 23
0

Usually, the interest is added to the invested money at the end of a year. Therefore, simply multiplying by the number of years might not yield the desired result. So, if you have a rate in percent, you would calculate

accruedAmount = invested * (1 + ratePercent/100)^years

Assuming:

decimal invested, ratePercent;
int years;

calculate:

decimal accruedAmount = invested * (decimal)Math.Pow(1 + (double)ratePercent/100), years);

Btw., interest rate in percent is 100 * interest / invested. You got it wrong, because you divide by 100 and multiply by invested. Probably you confused the terms. It should read

// Interest for one year (with interestRate in %):
interest = interestRate / 100 * invested;
Olivier Jacot-Descombes
  • 104,806
  • 13
  • 138
  • 188
0

You can refactor the switch block like that:

if (years >= 1 && years =< 30)
  Console.WriteLine("Your return = R {0}", invested + interestRate * years);

You should use double instead of float, if you can, to have more precision and less problems, and on x64 systems double is generally optimized because of the 8 bytes, so float becomes more and more obsolete for new developments.

Is using double faster than float?

But decimal may be a better choice for currency operations as indicated by @Fildor.