计算折扣价

时间:2014-02-25 00:12:05

标签: c# winforms

我想让我的申请计算折扣价。这是我找到折扣价的方式,但我有一点问题(逻辑问题):

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");
    }
}

这就是结果,即使我已经给出折扣价值,折扣后的总价仍与总价相同。

enter image description here

4 个答案:

答案 0 :(得分:4)

处理 money 时,请勿使用int(或Convert.ToInt32)。

见这个

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

calculateDiscount将为0,因为0.1将被转换为0.

答案 1 :(得分:4)

鉴于

  • 价格为P0 <= P
  • 折扣百分比D,使0 <= D <= 100

您可以计算需要应用的折扣(降价)MD

MD = P * (D/100)

然后,您可以将折扣价DP视为

DP = P - MD

鉴于此,这应该是你:

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 ;
  }
}

答案 2 :(得分:3)

我怀疑问题主要是由于你使用整数来解决所有问题。特别是这两行:

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

当您使用10作为“10%”作为折扣时,第二行实际上导致零。这是因为你在做整数数学:整数只能是整数,当它们有一个不完整的数字时,它们会截断它。在这种情况下,示例中的discount / 100将为0.1,这将被截断为零。

我建议对所有金融交易使用小数,而不是使用int。我将使用decimal替换整个函数中的大多数整数变量类型。

答案 3 :(得分:0)

我认为你会遇到问题......

calculateDiscount = Convert.ToInt32(discount / 100);

Int(整数)是整数,它们将向下舍入。如果折扣小于100,它将始终为零。

避免对财务事务使用double或float,因为它们会产生相当大的浮点错误。

使用整数很好,因为它们准确而快速,但是你必须始终考虑如何舍入数字,确保操作数和结果始终是整数。

如果它们不是整数,则使用Decimal结构,它在封面下由三个整数组成,但比使用整数慢三倍。

在大多数情况下,速度比快速快3倍,但最终仍然快速,因此如果有疑问则使用小数。