我想让我的申请计算折扣价。这是我找到折扣价的方式,但我有一点问题(逻辑问题):
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");
}
}
这就是结果,即使我已经给出折扣价值,折扣后的总价仍与总价相同。
答案 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)
鉴于
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 ;
}
}
答案 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倍,但最终仍然快速,因此如果有疑问则使用小数。