2015-10-09 7 views
0

Я пытаюсь рассчитать скидку в зависимости от возрастной категории человека и количества посещений в парикмахерской. Тем не менее, он работает неправильно. Он не вычисляет надлежащую скидку до второго щелчка, а затем делает некоторые странные вещи, если я продолжаю настаивать на вычислении. Просто интересно, где я ошибаюсь, спасибо.Расчет скидки в VB.NET

' Discount 
If radAdult.Checked = True Then 
    discount = 0 

ElseIf radChild.Checked = True Then 
    discount = totalPrice * 0.1 

ElseIf radStudent.Checked = True Then 
    discount = totalPrice * 0.05 

ElseIf radSenior.Checked = True Then 
    discount = totalPrice * 0.15 
End If 

' Additional discount 
If txtClientVisits.Text >= 1 And txtClientVisits.Text <= 3 Then 
    additionalDiscount = 0 

ElseIf txtClientVisits.Text >= 4 And txtClientVisits.Text <= 8 Then 
    additionalDiscount = totalPrice * 0.05 

ElseIf txtClientVisits.Text >= 9 And txtClientVisits.Text <= 13 Then 
    additionalDiscount = totalPrice * 0.1 

ElseIf txtClientVisits.Text >= 14 Then 
    additionalDiscount = totalPrice * 0.15 
End If 

totalPrice = baseRate + serviceRate - (discount + additionalDiscount) 
+0

Вы не отправлял весь код. Можете ли вы отправить **, где ** он не вычисляет правильно? –

+0

Опция переключателя строго указана на –

ответ

0

Тип объекта txtClientVisits.Text является строкой. Операторы сравнения <, >, >= и <= для строк выполняют лексикографическое сравнение. Затем VB преобразует 14 в строку «14» и поэтому сравнивает каждую цифру один за другим, , который не то, что вы хотите.

(Вот почему я не люблю VB.NET - потому что он выполняет эти неявные преобразования без предупреждения).

Вам нужно будет явно преобразовать число в текстовом поле до фактического числа, а затем сравнить основываясь на том, что:

Dim clientVisits As Integer = CInt(txtClientVisits.Text) 
If clientVisits >= 1 AndAlso clientVisits < 4 Then 
    additionalDiscount = 0 
ElseIf clientVisits >= 4 AndAlso clientVisits < 9 Then 
    additionalDiscount = totalPrice * 0.05 
ElseIf clientVisits >= 9 AndAlso clientVisits < 14 Then 
    additionalDiscount = totalPrice * 0.1 
ElseIf clientVisits >= 14 Then 
    additionalDiscount = totalPrice * 0.15 
End If 

Я отмечаю вы использовали инклюзивных граничные значения. Это работает для целочисленных значений, но не будет работать для непрерывных значений (с плавающей запятой). Обратите внимание, как я использую >= и < вместо >= и <=, чтобы избежать этого случая.

Кроме того, обратите внимание, что я использую оператор AndAlso, который является короткозамкнутым (по сравнению с And, который не является). Это не функциональное изменение, это просто означает, что программа будет работать немного быстрее.

Кроме того, вам не нужно делать, потому что ElseIf radChild.Checked = True Then значение .Checked собственности уже логическое значение, вы можете сделать это вместо того, чтобы:

ElseIf radChild.Checked Then 
+2

опцией строгой является ваш друг – peterG

+0

Кажется, что не имеет значения @Dai – YoungMogul

+0

@YoungMogul, что происходит, когда вы проходите его отладку? – Dai

Смежные вопросы