Не можете понять, как рассчитать не составной налог и смесь в следующем методе? - PullRequest
2 голосов
/ 14 апреля 2011

В следующем классе есть только один метод, который возвращает делитель определенного процента, поэтому, если я передам ему 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

Я не уверен, как реализовать вышеизложенное.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2011

Попробуйте это:

public class Adjustment
{
    public decimal Amount {get;set;}
    public bool IsCompounded {get;set;}
    public bool Add{get;set;}

    public decimal Calculate()
    {
        if(IsCompounded)
            return 1 + Amount / 100.0M;
        else
            return Amount / 100.0M;
    }
 }

void Main()
{
    List<Adjustment> adjustments = new List<Adjustment>();
    adjustments.Add(new Adjustment() {Amount = 10.0M, IsCompounded = false, Add = true});
    adjustments.Add(new Adjustment() {Amount = 7.0M, IsCompounded = false, Add = true};);

    decimal value = 0.0M;
    decimal total = 100.0M;

    foreach(Adjustment a in adjustments)
    {
        value = a.Calculate();

        if(a.IsCompound)
        {
            if(a.Add)
                 total *= value;
             else
                 total /= value;
        }
        else
        {
            if(a.Add)
                 total += value; //should be a sum for nom-compounded
             else
                 total -= value;
        }
    }

    Console.WriteLine(total);
}
0 голосов
/ 14 апреля 2011

Если я правильно понимаю ваши требования, я думаю, что вам просто нужно хранить отдельные составные и не составные дроби при выполнении итерации по корректировкам и просто объединять их в конце.

decimal total = 100.0M;

decimal compounded = 1.0M;
decimal nonCompounded = 0.0M;
foreach(Adjustment a in adjustments)
{
    if(a.IsCompounded)
    {
        decimal value = (1.0m + a.Calculate(a.Amount));

        if (a.Add)
            compounded *= value;
        else
            compounded /= value;
    }
    else
    {
        decimal value = a.Calculate(a.Amount);

        if (a.Add)
            nonCompounded += value;
        else
            nonCompounded -= value;
    }
}

if (nonCompounded >= 0)
{
  total *= (compounded + nonCompounded);
}
else
{
  total *= (compounded / (1.0m - nonCompounded));
}

Будете ли вы толькокогда-нибудь передать a.Amount в a.Calculate?Тогда вы можете прочитать сумму из объекта, например,

public decimal Calculate()
{
    return (Amount / 100.0M);
}

, или вместо этого вы можете получить это свойство, например,

public decimal AmountFraction
{
    get
    {
        return (Amount / 100.0M);
    }
}

, которое вы затем прочитаете как decimal value = a.AmountFraction;то есть как свойство, а не вызов функции.

Редактировать: изменена комбинационная строка для удаления несоставных дробей согласно комментариям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...