我有一个电子帐单系统。在一个月的时间里,宿舍里的每个房间都有1000菲律宾比索的电费(以*为例),这笔电费是由边境消费的。因此,它被两个边界分割(对于它的样本),但它还取决于边界进入房间的日期。
我应该怎么做才能根据他们进入房间的日期将电费的金额除以边界数?我的计算代码已经基于每个房间的边界数量。
//compute of kilowatts
double a, b;
a = Convert.ToDouble(txtpresent.Text);
b = Convert.ToDouble(txtlastmonth.Text);
b = a - b;
if (b <= 0)
{
b = 0;
MessageBox.Show("this bill is greather that to provious bill. \n \n please! Check the Bill");
}
else
{
txtperklwt.Text = "9.00";
txtconsume.Text = Convert.ToDecimal(b).ToString("###,##0.00");
Consume();
CountRMBORDERNO();
//txtperhead.Focus();
txtpresent.Enabled = true;
button5.Enabled = true;
btnSub.Enabled = true;
btnSub.Text = "Submit";
}
//consume of number of border in a one month kilowatts
private void Consume()
{
double x, y;
x = Convert.ToDouble(txtconsume.Text);
y = Convert.ToDouble(txtperklwt.Text);
y = y * x;
lbBillofMonth.Text = Convert.ToDecimal(y).ToString("###,##0.00");
}发布于 2020-02-05 16:52:08
首先,尽量不要把双精度和小数混在一起。而是到处使用小数。原因是Double是浮点值,虽然它们可以存储更多的数字,但这些数字有时可能会不同。Double vs Decimal
因此,请更改代码的顶部
double a, b;
a = Convert.ToDecimal(txtpresent.Text);
b = Convert.ToDecimal(txtlastmonth.Text);
b = a - b;或者,为了获得更美观的代码和错误检查,可以使用(C# 6+代码)
if(decimal.TryParse(txtpresent.Text, out decimal a) && decimal.TryParse(txtlastmonth.Text, out decimal b)
{
//The rest of your code
}现在,您希望根据每个边框进入房间的时间来调整每个边框的值。您显然需要知道边界何时进入房间,以及一个月中有多少天。这里有一段代码,你可以用它来计算账单。
public Dictionary<int, decimal> CalculateBorderTotals(int monthNo, decimal totalConsumed, Dictionary<int, int> borderEnterRoom, Dictionary<int, int> borderLeftRoom)
{
var result = new Dictionary<int, decimal>();
var minDay = borderEnterRoom.Values.Min();
var maxDay = borderLeftRoom.Values.Max();
var consumptionPerDay = totalConsumed / (maxDay - minDay);
foreach (var item in borderEnterRoom)
{
if (borderLeftRoom.ContainsKey(item.Key))
result.Add(item.Key, consumptionPerDay * (borderLeftRoom.FirstOrDefault(x => x.Key == item.Key).Value - item.Value) + 1); //The + 1 is discression depending how you calculate your number of days
else
result.Add(item.Key, consumptionPerDay * (DateTime.DaysInMonth(DateTime.Now.Year, monthNo) - item.Value + 1));
}
return result;
}要调用此函数,您只需将borderNumber和他们进入/离开房间的日期传入字典,它将计算每个边界需要支付的金额。例如
var borderEntered = new Dictionary<int, int>();
var borderLeft = new Dictionary<int, int>();
borderEntered.Add(1, 3);
borderEntered.Add(2, 7);
borderEntered.Add(3, 1);
borderLeft.Add(3, 15);
var result = CalculateBorderTotals(1, 1000, borderEntered, borderLeft);结果将显示边界编号和到期金额。因为您使用的都是相同类型的数字,所以也可以使用一种不同的方法来使其成为字符串。
txtconsume.Text = b.ToString("###,##0.00");并更改您的消费方法,并在其中传递数字,而不是从文本框中获取数字。更好的实践
private decimal CalculateConsumed(decimal costPerUnit, decimal TotalUnits)
{
return costPerUnit * TotalUnits;
}并像这样使用它
lbBillofMonth.Text = CalculateConsumed.ToString("###,##0.00");如果你明白了,请告诉我。
https://stackoverflow.com/questions/60037254
复制相似问题