winforms 计算折扣价

yk9xbfzb  于 2022-11-25  发布在  其他
关注(0)|答案(5)|浏览(164)

我想让我的应用程序计算一个折扣价格,这就是我如何找到我的折扣价格,但我有一个小问题(逻辑问题):

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

这就是结果,折扣后的总额仍然与总价相同,尽管我已经给予它折扣值。

zqdjd7g9

zqdjd7g91#

给定

  • 价格P使得0 <= 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 ;
  }
}
afdcj2ne

afdcj2ne2#

处理 money 时不要使用int(或Convert.ToInt32)。
看这个

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

calculateDiscount将变为0,因为0.1将转换为0。

sg2wtvxw

sg2wtvxw3#

我怀疑这个问题主要是因为你在所有的事情上都使用了整数,特别是下面这两行:

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

当你用10来表示“10%”的折扣时,第二行实际上是零,这是因为你在做整数运算:整数只能是整数,当它们有一个非整数时,它们会将其截断。在本例中,您示例中的discount / 100将是0.1,它将被截断为零。
我建议在所有金融交易中使用decimal,而不是int。我会用decimal替换整个函数中的大多数整型变量类型。

e37o9pze

e37o9pze4#

我觉得你会有问题...

calculateDiscount = Convert.ToInt32(discount / 100);

Int(Integers)是整数,会向下舍入。如果折扣小于100,则一律为零。
避免在金融交易中使用double或float,因为它们会产生相当大的浮点错误。
使用整数是好的,因为它们准确而快速,但是你必须总是考虑如何将数字四舍五入,确保操作数和结果总是整数。
如果它们不是整数,则使用Decimal结构,该结构的底层由三个整数组成,但比使用整数慢三倍。
在大多数情况下是3倍慢于令人眼花缭乱的快,仍然结束了令人眼花缭乱的快,所以当有疑问时,使用小数。

laik7k3q

laik7k3q5#

如果你想从折扣价格和折扣值中得到原始价格,你可以使用这个代码

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

相关问题