Equated Monthly Installment (EMI) for Home Loan and Amortization Schedule Any comment on my code?
Data model
public class LoanRepaymentPlan
{
    public decimal TotalRepaymentAmount { get; private set; }
    public decimal CurrentOutstandingAmount { get; private set; }
    public decimal MonthlyRepaymentInterestAmount { get; private set; }
    public decimal MonthlyRepaymentAmount { get; private set; }
    public DateTime RepaymentDate { get; private set; }

    private LoanRepaymentPlan(decimal TotalRepaymentAmount, decimal CurrentOutstandingAmount, decimal MonthlyRepaymentAmount)
    {
        this.TotalRepaymentAmount = TotalRepaymentAmount;
        this.CurrentOutstandingAmount = CurrentOutstandingAmount;
        this.MonthlyRepaymentAmount = MonthlyRepaymentAmount;
    }

    public static LoanRepaymentPlan Create(decimal TotalRepaymentAmount, decimal CurrentOutstandingAmount, decimal MonthlyRepaymentAmount)
    {
        return new LoanRepaymentPlan(TotalRepaymentAmount, CurrentOutstandingAmount, MonthlyRepaymentAmount);
    }
}

Main calculation
static void Main(string[] args)
{
    Console.WriteLine(&quot;Equated Monthly Installment (EMI) for Home Loan&quot;);

    Console.WriteLine(&quot;Total Loan Amount: &quot;);
    var principal = Convert.ToDouble(Console.ReadLine());

    Console.WriteLine(&quot;Interest Rate Per Annum (%): &quot;);
    var interestRatePerAnnum = Convert.ToDouble(Console.ReadLine()) / 100;

    Console.WriteLine(&quot;Loan Period (in years): &quot;);
    var years = Convert.ToDouble(Console.ReadLine());

    Console.WriteLine(&quot;------------------------------------------------&quot;);

    Console.WriteLine(&quot;Monthly installment: &quot; + HousingLoanInterest(principal, interestRatePerAnnum, years).ToString(&quot;C2&quot;));

    decimal totalRepaymentAmount = 0;
    var monthlyRepaymentAmount = HousingLoanInterest(principal, interestRatePerAnnum, years);
    var tenure = years * 12;
    var principalAndInterest = CompoundInterest(principal, interestRatePerAnnum, 12, years);
    List&lt;LoanRepaymentPlan&gt; repaymentPlans = new List&lt;LoanRepaymentPlan&gt;();

    while (tenure &gt;= 0)
    {
        totalRepaymentAmount = totalRepaymentAmount + (decimal)monthlyRepaymentAmount;
        tenure = tenure - 1;

        repaymentPlans.Add(LoanRepaymentPlan.Create(totalRepaymentAmount,
            (decimal)principalAndInterest - totalRepaymentAmount, (decimal)monthlyRepaymentAmount));
    }

    var table = new ConsoleTable(&quot;Current Outstanding Amount&quot;, &quot;Monthly Repayment Amount&quot;, &quot;Total Repayment Amount&quot;);
    foreach (var item in repaymentPlans)
    {
        table.AddRow(item.CurrentOutstandingAmount, item.MonthlyRepaymentAmount, item.TotalRepaymentAmount);
    }
    table.Write();
}

Helper methods
static double CompoundInterest(double principal, double interestRate, int timesPerYear, double years)
{
    // (1 + r/n)
    double body = 1 + (interestRate / timesPerYear);

    // nt
    double exponent = timesPerYear * years;

    // P(1 + r/n)^nt
    return principal * Math.Pow(body, exponent);
}

static double HousingLoanInterest(double loanAmount, double interestRate, double years)
{
    return (loanAmount * Math.Pow((interestRate / 12) + 1,
         (years * 12)) * interestRate / 12) / (Math.Pow
         (interestRate / 12 + 1, (years * 12)) - 1);
}

There are some inaccuracy of the calculation but I will try to figure out later. One thing bothers me is the Math.Pow which uses double. I have tried to convert the calculation to decimal but unable to do so at the moment.
var
Particularly given that you have accuracy issues, it's important for your own understanding of what the code does to be explicit in the following declarations:
    var monthlyRepaymentAmount = HousingLoanInterest(principal, interestRatePerAnnum, years);
    var tenure = years * 12;
    var principalAndInterest = CompoundInterest(principal, interestRatePerAnnum, 12, years);

From these lines alone, I have no idea if these are supposed to be doubles, integers, decimals, etc. Just spell out the actual type.
In-place operations
        totalRepaymentAmount = totalRepaymentAmount + (decimal)monthlyRepaymentAmount;
        tenure = tenure - 1;
     

can be
totalRepaymentAmount += monthlyRepaymentAmount;
tenure--;

Formatting
This could benefit from some temporary variables, but even without them,
    return (loanAmount * Math.Pow((interestRate / 12) + 1,
         (years * 12)) * interestRate / 12) / (Math.Pow
         (interestRate / 12 + 1, (years * 12)) - 1);

is more legible as
return (
    loanAmount * Math.Pow(
        interestRate / 12 + 1,
        years * 12
    ) * interestRate / 12
) / (
    Math.Pow(
        interestRate / 12 + 1,
        years * 12
    ) - 1
);

which in turn is equivalent to
double annual = interestRate / 12;
double pow = Math.Pow(
    annual + 1,
    years * 12
);
return loanAmount * pow * annual / (pow - 1);

Simpler yet:
double annual = interestRate / 12,
       pow = Math.Pow(
           annual + 1,
           -12 * years
       );
return loanAmount * annual / (1 - pow);

Please test this for equivalence.