首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宿舍电费计费系统

宿舍电费计费系统
EN

Stack Overflow用户
提问于 2020-02-03 18:23:58
回答 1查看 135关注 0票数 0

我有一个电子帐单系统。在一个月的时间里,宿舍里的每个房间都有1000菲律宾比索的电费(以*为例),这笔电费是由边境消费的。因此,它被两个边界分割(对于它的样本),但它还取决于边界进入房间的日期。

我应该怎么做才能根据他们进入房间的日期将电费的金额除以边界数?我的计算代码已经基于每个房间的边界数量。

Example 1 Example 2

代码语言:javascript
复制
//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");
    }
EN

回答 1

Stack Overflow用户

发布于 2020-02-05 16:52:08

首先,尽量不要把双精度和小数混在一起。而是到处使用小数。原因是Double是浮点值,虽然它们可以存储更多的数字,但这些数字有时可能会不同。Double vs Decimal

因此,请更改代码的顶部

代码语言:javascript
复制
double a, b;
a = Convert.ToDecimal(txtpresent.Text);
b = Convert.ToDecimal(txtlastmonth.Text);
b = a - b;

或者,为了获得更美观的代码和错误检查,可以使用(C# 6+代码)

代码语言:javascript
复制
if(decimal.TryParse(txtpresent.Text, out decimal a) && decimal.TryParse(txtlastmonth.Text, out decimal b)
{
    //The rest of your code
}

现在,您希望根据每个边框进入房间的时间来调整每个边框的值。您显然需要知道边界何时进入房间,以及一个月中有多少天。这里有一段代码,你可以用它来计算账单。

代码语言:javascript
复制
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和他们进入/离开房间的日期传入字典,它将计算每个边界需要支付的金额。例如

代码语言:javascript
复制
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);

结果将显示边界编号和到期金额。因为您使用的都是相同类型的数字,所以也可以使用一种不同的方法来使其成为字符串。

代码语言:javascript
复制
txtconsume.Text = b.ToString("###,##0.00");

并更改您的消费方法,并在其中传递数字,而不是从文本框中获取数字。更好的实践

代码语言:javascript
复制
private decimal CalculateConsumed(decimal costPerUnit, decimal TotalUnits)
{
    return costPerUnit * TotalUnits;
}

并像这样使用它

代码语言:javascript
复制
lbBillofMonth.Text = CalculateConsumed.ToString("###,##0.00");

如果你明白了,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60037254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档