C#为什么我的计算没有正确添加?

时间:2018-09-24 02:42:23

标签: c# datetime while-loop

我正在填写一份计算预订日期的表格。 在周五和周六,一间客房的费用为150美元,而在其他日子则为120美元。我使用了while循环来进行设置,但是由于某种原因,它一直在计算错误的价格。

应该是什么样子

enter image description here

它是什么样的:

enter image description here

这是我的代码:

int nights = 0;
int price = 0;

private void btnCalculate_Click(object sender, EventArgs e)
    {
        DateTime arrivalDate = DateTime.Parse(txtArrivalDate.Text);
        DateTime departureDate = DateTime.Parse(txtDepartureDate.Text);
        TimeSpan ts = departureDate.Subtract(arrivalDate);
        nights = ts.Days;

        while (arrivalDate != departureDate)
        {
            DayOfWeek dow = arrivalDate.DayOfWeek;
            if (dow == DayOfWeek.Friday || 
                dow == DayOfWeek.Saturday)
            {
                price = 150;
            }
            else
            {
                price = 120;
            }

            arrivalDate = arrivalDate.AddDays(1);

        }

        txtNights.Text = nights.ToString();
        int totalPrice = price * nights;
        txtTotalPrice.Text = totalPrice.ToString();
        int average = totalPrice / nights;
        txtAvgPrice.Text = average.ToString();
        txtArrivalDate.Focus();
    }

2 个答案:

答案 0 :(得分:5)

简而言之,int totalPrice = price * nights;该行应删除,而在while循环中,price += 120price += 150在每种情况下均应删除。 totalPrice可以简单地替换为price

您没有使用while循环中设置的priceprice设置为120或150,但随后被下一个值覆盖(先前的值被完全忽略)。因此,一旦您的代码退出了while循环,就会使用最新的price集并将其乘以总住宿天数。

因此,您的代码正在执行的操作是获取最后一天的price(在这种情况下为2016年2月1日),然后乘以总夜晚数。它应该做的是在循环内保持price的总运行量。

答案 1 :(得分:-3)

您没有对price做任何事情。

它应该在while循环中使用。

此外,您应该使用.TotalDays,而不是.Days

类似的东西:

            public static (decimal price, int nights) GetPrice
        (DateTime arrivalDate, DateTime departureDate)
    {
        //This code assumes there is no time component in the dates provided 

        if(departureDate < arrivalDate )
        {
            throw new ArgumentException("Arrival after Departure");
        }

        if (departureDate.Date == arrivalDate.Date)
        {
            //TODO
            return (0, 0);
        }

        Decimal totalPrice = 0;
        DateTime day = arrivalDate;
        while (day != departureDate)
        {
            totalPrice += GetRate(day.DayOfWeek);
            day = day.AddDays(1);
        }
        return (totalPrice, (int)(departureDate - arrivalDate).TotalDays);
    }

    private static decimal GetRate(DayOfWeek dow)
    {
        return (dow == DayOfWeek.Friday || dow == DayOfWeek.Saturday)
            ? 150
            : 120;
    }