В следующем классе есть только один метод, который возвращает делитель определенного процента, поэтому, если я передам ему 5, он вернет 0.05.
public class Adjustment
{
public decimal Amount {get;set;}
public bool IsCompounded {get;set;}
public bool Add{get;set;}
public decimal Calculate(decimal amount)
{
return (amount / 100.0M);
}
}
Мой основной метод определен следующим образом:
void Main()
{
Adjustment a1 = new Adjustment {Amount = 10.0M, IsCompounded = false, Add = true};
Adjustment a2 = new Adjustment {Amount = 7.0M, IsCompounded = false, Add = true};
List<Adjustment> adjustments = new List<Adjustment>();
adjustments.Add(a1);
adjustments.Add(a2);
decimal value = 0.0M;
decimal total = 100.0M;
foreach(Adjustment a in adjustments)
{
if(a.IsCompounded)
{
value = (1 + a.Calculate(a.Amount));
if(a.Add)
total *= value;
else
total /= value;
}
else if(!a.IsCompounded)
{
value += a.Calculate(a.Amount);
if(a.Add)
total *= value;
else
total /= value;
}
}
Console.WriteLine(total);
}
В приведенном выше основном методе я начинаю с 100 в качестве общей суммы, и если все налоги составлены, все работает нормально, я получаю 117,7, а если я беру 117,7 и убираю налоги, я возвращаюсь к 100. Для не составной, мне нужно только добавить 1 до самого конца, а затем разделить общее на это, но я не уверен, как это сделать. В настоящее время, когда я зацикливаюсь, я просто добавляю делители, например, 0,1 + 0,07 = 0,17. Вне цикла мне нужно добавить 1 к этому, чтобы получить 1,17, а затем умножить или разделить итоговую сумму, чтобы либо добавить, либо убрать налог соответственно. Затем возникает проблема того, что корректировки составляются и не составляются, что становится более сложным. В этом случае мне нужно сделать что-то вроде следующего:
Например, предположим, у меня есть 3 налога, 10, 7 и 3. 10 и 7 являются сложными, а 3 не составными, поэтому формула:
100 * (1 + ((1 + 0,10) * (1 + 0,07) -1) + ((1 + 0,03) -1)), что упрощается до 100 * ((1 + 0,10) * ((1+ 0,07) + 0,03) = 120,70
Я не уверен, как реализовать вышеизложенное.