2015-01-05 2 views
-1

Может кто-то сказать, что случилось с моим кодом?расчет скидки в C# ошибка при присвоении значения

Я уже пробовал кастинг сначала, но я получаю тот же результат.

/// <summary> 
    /// Discount function 
    /// </summary> 
    /// <param name="ToDiscount">Price of an item</param> 
    /// <param name="Discount">Discount</param> 
    /// <param name="Type">Percent or Amount</param> 
    /// <returns></returns> 
    private decimal Discount(decimal ToDiscount, int Discount, DiscountType Type) 
    { 
     decimal temp = 0; 
     try 
     { 
      if (Type == DiscountType.Percent) 
      { 
       int d = Convert.ToInt32((Discount/100) * ToDiscount); 
       decimal f = ToDiscount - d; 
       temp = f; 
      } 
      else if (Type == DiscountType.Currency) 
      { 
       decimal FinalDiscount = ToDiscount - Discount; 

       temp = FinalDiscount; 
      } 
     } 
     catch (Exception ex) 
     { 
      Functions.ShowError(ex); 
     } 

     return temp; 
    } 

Пример:

Discount(5000, 5, DiscountType.Percent); 
//calculation: (5/100) * 5000 = 250 
//discount: 5000 - 250 = 4750 

но с этой функцией я создал я получаю результат 5000. вместо 4750. я сделал точку останова на возвр; но когда я нахожу эту часть int d = Convert.ToInt32((Discount/100) * ToDiscount); ответа или результата нет.

+0

В чем именно ошибка, которую вы получаете? Разве это не компилируется? Вызывает ли это исключение? Возвращает ли оно неправильное значение? – Chris

+0

как вы пытались отличить точно? это будет работать нормально, если вы скидка скидка в два раза или десятичная –

+0

@ selman22 'int a = Discount/100; double b = Convert.ToDouble (a * ToDiscount); double c = Convert.ToDouble (ToDiscount) - b; ' – mardagz

ответ

3

Линия:

int d = Convert.ToInt32((Discount/100) * ToDiscount); 

ли целочисленная арифметика, где Discount/100 будет ноль для дисконта между нулем и 99.

Вам необходим т о применить скидку по десятичной системе, или с плавающей точкой:

int d = Convert.ToInt32((Discount/100m) * ToDiscount); 

Как и в стороне, называя переменную Type, вероятно, будет вызывать несколько читаемости головных болей вниз по линии.

+0

этот один правильный .. работа на меня. во всяком случае что с этим м на 100? – mardagz

+1

'm' говорит, что это десятичный литерал вместо целочисленного литерала. – Chris

+0

ах, я вижу, спасибо. – mardagz

4

Discount/100 выполняет целочисленное деление, при котором результат равен 0.

Следовательно (Discount/100) * ToDiscount также равен 0, в результате чего ничего не вычитается из ToDiscount.

Я думаю, что самое лучшее, что вам нужно сделать, это изменить тип Discount на decimal, что решит все ваши проблемы.

+0

этот правый тоже. но это 'int d = Convert.ToInt32 ((Discount/100m) * ToDiscount);' то, что им нужно .. спасибо в любом случае ... решено .. – mardagz

+1

Не проблема. Мне любопытно, однако: это ваше намерение разрешить только скидки на целый номер? – IronMan84

+0

@ IronMan84 хорошая точка, 300% скидка не будет крутой, цена будет отрицательной –

1

Когда вы делаете это: Convert.ToInt32 ((Discount/100) * ToDiscount); у вас будет иметь 0, потому что:

Discount/100 = 0 (если скидка INTM результат будет целое)

вы должны сделать расчет с двойными номерами

Смежные вопросы