Kaoru
Kaoru

Reputation: 2883

Calculate discount price

I want to make my application to calculate a discount price. This is how I find my discount price, but I have a little problem (logic problem):

private void UpdateDiscount(object sender, EventArgs e)
{
    decimal actualPrice = 0;
    decimal discount = 0;
    int calculateDiscount = 0;
    int totalDiscount = 0;
    int afterDiscount = 0;
    int totalAfterDiscount = 0;
    int total = 0;

    if (numericTextBox1.TextLength == 6)
    {
        this.numericUpDown2.Enabled = true;

        discount = Convert.ToInt32(this.numericUpDown2.Value);

        calculateDiscount = Convert.ToInt32(discount / 100);

        totalDiscount = calculateDiscount;

        if (!string.IsNullOrEmpty(this.numericTextBox3.Text.ToString()))
        {
            actualPrice = Convert.ToDecimal(this.numericTextBox3.Text);
        }

        else
        {
            numericTextBox3.Text = "";
        }

        afterDiscount = Convert.ToInt32(actualPrice * totalDiscount);
        totalAfterDiscount = Convert.ToInt32(actualPrice);
        total = Convert.ToInt32(totalAfterDiscount - afterDiscount);

        if (numericUpDown2.Value > 0)
        {
            this.numericTextBox6.Text = total.ToString();
        }
    }

    else if (numericTextBox1.TextLength != 6)
    {
        this.numericUpDown2.Enabled = false;

        this.numericUpDown2.Value = 0;
        this.numericTextBox6.Text = "";
    }

    else
    {
        actualPrice = 0;
        discount = 0;
        calculateDiscount = 0;
        totalDiscount = 0;
        afterDiscount = 0;
        totalAfterDiscount = 0;
        total = 0;

        MessageBox.Show("There is no data based on your selection", "Error");
    }
}

This is the result, the total after discount still same with the total price, even though I already give it discount value.

enter image description here

Upvotes: 4

Views: 33050

Answers (5)

JAKE
JAKE

Reputation: 1

if you want to get the Original Price from the Discounted Price and Discount Value. you can use this code

using System;
                    
public class Program
{
    public static void Main()
    {
        decimal discountedPrice = 280;
        decimal discount = (decimal)0.20;
        decimal originalPrice = discountedPrice / (decimal)(1-discount);
        Console.WriteLine(originalPrice);
    }
}```

Upvotes: 0

Nicholas Carey
Nicholas Carey

Reputation: 74227

Given

  • a price P such that 0 <= P, and
  • a discount percentage D such that 0 <= D <= 100

you can compute the discount (markdown) MD that needs to be applied as

MD = P * (D/100)

You can then get the discounted price DP as

DP = P - MD

Given that, this should do you:

public static class DecimalHelpers
{
  public static decimal ComputeDiscountedPrice( this decimal originalPrice , decimal percentDiscount )
  {
    // enforce preconditions
    if ( originalPrice   <   0m ) throw new ArgumentOutOfRangeException( "originalPrice"   , "a price can't be negative!"    ) ;
    if ( percentDiscount <   0m ) throw new ArgumentOutOfRangeException( "percentDiscount" , "a discount can't be negative!" ) ;
    if ( percentDiscount > 100m ) throw new ArgumentOutOfRangeException( "percentDiscount" , "a discount can't exceed 100%"  ) ;

    decimal markdown        = Math.Round( originalPrice * ( percentDiscount / 100m) , 2 , MidpointRounding.ToEven ) ;
    decimal discountedPrice = originalPrice - markdown ;

    return discountedPrice ;
  }
}

Upvotes: 6

Mick
Mick

Reputation: 6864

I think you're going to have problems with...

calculateDiscount = Convert.ToInt32(discount / 100);

Int (Integers) are whole numbers, they will be rounded down. If discount is less than 100 it will always be zero.

Avoid using double or floats for financial transactions as they can produce considerable floating point errors.

Using integers is good, as they are accurate and quick, HOWEVER you MUST always consider how numbers will be rounded, ensure the operands and results are always whole numbers.

If they are not whole numbers use the Decimal structure, which under the covers is comprised of three integers, but three times slower than using integers.

In most cases being 3 times slower than blindingly quick, still ends up being blindingly quick so when in doubt use Decimals.

Upvotes: 0

Big Luke
Big Luke

Reputation: 224

I suspect the problem is mostly due to the fact that you're using integers for everything. In particular, these two lines:

discount = Convert.ToInt32(this.numericUpDown2.Value);    
calculateDiscount = Convert.ToInt32(discount / 100);

When you use 10 for "10%" as the discount, the second line there is actually resulting in a zero. This is because you are doing integer mathematics: integers can only be whole numbers, and when they have a number that is not whole they truncate it. In this case, discount / 100 in your example would be 0.1, which would get truncated to zero.

Instead of using int, I recommend using decimal for all financial transactions. I would replace most of your integer variable types throughout that function with decimal.

Upvotes: 3

L.B
L.B

Reputation: 116108

Don't use int (or Convert.ToInt32) when dealing with money.

See this

decimal discount = 10;
var calculateDiscount = Convert.ToInt32(discount / 100);
MessageBox.Show(calculateDiscount.ToString());

calculateDiscount will be 0 because 0.1 will be converted 0.

Upvotes: 4

Related Questions