Divide Into Monthly Installments

Hi I'm trying to make Monthly Installments of a "double value" The Problem is that the decimal values get divided too, and i don't need that happen.

Example :

List<Installments> InstallmentList {get; set;}

for (int i = 0 ; int i <= Month ; i++)
{
    double Value = 90.10 ;
    int Month = 3;


    InstallmentCost = Value / Month;
     
      InstallmentList.Add (new Installment {InstallmentCost = example.InstallmentCost}      )
}

Doing That i will get a list of Installments where the value will be :

  1. Installment = 30.03333333333333;
  2. Installment = 30.03333333333333;
  3. Installment = 30.03333333333333;

But I need that the decimals do not divide and and only the last Installment gets it

Example Of The Results that i need :

  1. Installment = 30.00;
  2. Installment = 30.00;
  3. Installment = 30.10;

Upvotes: 0

Views: 509

Answers (3)

Apurv Kumar
Apurv Kumar

Reputation: 56

Just truncate the installment which only takes the integral part (if not C# then convert to something like int and back to double would do the trick!).

I have used C#, here's the working solution:-

double Value = 90.10;
int Month = 3;
        
for (int i = 1; i <= Month ; i++)
{
     var installmentCost = Math.Truncate(Value / Month);
     InstallmentList.Add(new Installment {InstallmentCost = installmentCost});
}

// Extract pending balance to be adjusted, total - the sum of all installments
double pendingBalanceToAdjust = Value - InstallmentList.Sum((s) => s.InstallmentCost);

// Update to the last installment
if (pendingBalanceToAdjust > 0)
    InstallmentList.Last().InstallmentCost += pendingBalanceToAdjust;

Upvotes: 1

fubo
fubo

Reputation: 45967

Linq approach

decimal value = 90.10m;
int month = 3;
List<Installment> installments = Enumerable.Range(0, month).Select(x => new Installment() { InstallmentCost = Math.Floor(value / month) }).ToList();
installments.Last().InstallmentCost += (value - installments.Sum(x => x.InstallmentCost));

Upvotes: 1

gabrieliussla
gabrieliussla

Reputation: 47

You can calculate the remainder at the start and then divide the rest into equal parts:

double value = 90.10;
int month = 3;

// calculate the remainder with precision 0.1
double remainder = value % (month * 0.1);
double installmentValue = (value - remainder) / month;

for (int i = 0; i < month - 1; i++)
    InstallmentList.Add(new Installment {InstallmentCost = installmentCost});
InstallmentList.Add(new Installment {InstallmentCost = installmentCost + remainder});

the expression value % (month * 0.1) effectively works out what is left over if you keep giving each of the 3 months 0.1 from the value until you can no longer carry on.

Changing the precision to 0.01 will change the outcome to: 30.03, 30.03, 30.04

Upvotes: 1

Related Questions