2017-02-09 4 views
-5

Ok так вот моя проблема, у меня есть этот код:Попытка разделить два числа постоянно получаю ошибку Dividebyzero

decRatio = _intNumofRooms /intTotal; 
if (decRatio > 1/6) { 
    MessageBox.Show("There can't be more than six people in the same room!", "Trump's Hotel", MessageBoxButtons.OK, MessageBoxIcon.Information); 
    txtNumOfChildren.Focus(); 
    return false; 
} 
return true; 

У меня есть отель, который может принимать только 6 взрослых на номер. Взрослые (inTotal), и теперь я пытаюсь разделить количество комнат на то, сколько взрослых мне нужно получить соотношение, тогда, если соотношение больше 1/6, я пытаюсь показать, что ящик сообщений требует, чтобы они вводили сумма, в которой не более шести человек могут находиться в одной комнате, но продолжать получать ошибку dividebyzeroexception. Другие способы иметь такой коэффициент или как я могу решить это, пожалуйста?

+4

Вы уверены, что 'inTotal' не равен нулю? – Steve

+2

Пожалуйста, внесите свой код в вопрос, а не как внешнюю ссылку на картинку. – chwarr

+1

Скопируйте свой код в виде текста. Не используйте изображения. Показать, где 'intTotal' происходит от –

ответ

7

Целочисленное деление производит целое число в C#. 1/6 - это деление двух целых чисел, поэтому оно производит нуль. Если вы хотите, чтобы произвести фракции затем сделать математику в парном разряде:

double ratio = (double)numberOfRooms/(double)total; 
if (ratio > 1.0/6.0) ... 

Я не знаю, если это вызывает у вас деление на ноль ошибок, но код писал, очевидно, неправильно, поэтому начните с закреплением ее.

Кроме того, не называйте вещи в C# на основе того, какой тип они есть. Это не intNumberOfRooms. Это numberOfRooms. Это не intTotal, это totalNumberOfGuests.

Кроме того, ваша математика ошибочна. Предположим, что шесть человек и шесть комнат. Это отношение 6/6, которое больше 1/6, и поэтому это нарушение политики? У вас это полностью назад.

Вы бы лучше избежали отношений полностью. Вы можете сделать работу в целых числах, как это:

if (totalNumberOfGuests > 6 * totalNumberOfRooms) ... 

Не делать разделение, если вы можете сделать умножение вместо этого.

Далее: вы сконфигурировали свой пользовательский интерфейс с помощью кода вашей бизнес-политики. Предположим, вы решили изменить лимит с шести до пяти; сколько мест в коде нужно изменить? Вы должны не только изменить математику, но и строку ошибок. Инкапсулируйте эту логику в функцию, которая определяет, нарушена ли политика, и если да, то каково должно быть сообщение. Сохраните код своей бизнес-политики далеко от от вашего кода пользовательского интерфейса. Вы можете увидеть, как реорганизовать код, чтобы лучше отделить ваши проблемы?

Наконец, прежде чем размещать здесь вы должны прочитать:

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/

и вернуться, когда у вас есть конкретный вопрос о коде. «Я написал багги программу, которую я не могу исправить» не является вопросом .

+1

Я бы также предположил, что 'total' также проверяется на то, что он равен нулю, прежде чем он будет использоваться в этой операции, установив отношение к нулю, если оно есть. – Adrian

+0

Спасибо, профессор хочет, чтобы имена были такими, и мне лично это не нравится ... –

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