Member 12349103 Ответов: 5

Попытка деления на ноль


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

код

private void tbLayers_TextChanged(object sender, EventArgs e)
        {
            int SqIn, comBo;

            int.TryParse(tbSqIn.Text, out SqIn);
            int.TryParse(cbPalett.Text, out comBo);

            tbTotesPerLayers.Text = (comBo / SqIn).ToString();


Что я уже пробовал:

combo / ((SqIn == 0) ? 0 : SqIn)

[no name]

Почему бы вам просто не проверить, равен ли SqIn нулю, а затем не пытаться разделить его на ноль?

Richard MacCutchan

Это выражение неверно. Если SqIn равен нулю, вы пытаетесь разделить на ноль, вы должны разделить на 1.

5 Ответов

Рейтинг:
7

Karthik_Mahalingam

попробовать это

string defaultText = "sqIn in zero";
         tbTotesPerLayers.Text = SqIn ==0 ? defaultText: (comBo / SqIn).ToString();


Member 12349103

Спасибо за Ваш вклад программа отлично работает в Visual Studio без каких-либо ошибок.Когда я запускаю exe-файл, я получаю ошибку, некоторые поля автоматически заполняют данные, так что при вводе tb заполняется 0, пока я не закончу. Опять же работает нормально в VS.Все коробки имеют этот тип формата.

private void tbCasePerTier_TextChanged(object sender, EventArgs e)
        {
            int Height, TotesLayers;

            int.TryParse(tbHeight.Text, out Height);
            int.TryParse(tbTotesLayers.Text, out TotesLayers);

            string defaultText = "Height in zero";
            tbTotesPerLayers.Text = Height == 0 ? defaultText : (TotesLayers / Height).ToString();

Karthik_Mahalingam

в чем была ошибка

Member 12349103

Попытайтесь разделить на ноль.

Karthik_Mahalingam

тогда это может быть из какой-то другой области, проверьте с помощью блока try catch.

Member 12349103

Спасибо ребятам за большую помощь, этот код работал для меня так, как он помогает другим.
Я использовал его во всех коробках.

 private void tbLayers_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int SqIn, comBo;


                if (string.IsNullOrEmpty(tbSqIn.Text) || string.IsNullOrEmpty(tbPallet.Text))
                    return;

                int.TryParse(tbSqIn.Text, out SqIn);
                int.TryParse(tbPallet.Text, out comBo);

                if (SqIn > 0)
                    tbTotesPerLayers.Text = (comBo / SqIn).ToString();
                else
                    tbTotesPerLayers.Text = string.Empty;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Karthik_Mahalingam

хороший

Рейтинг:
2

Ramza360

Если SqIn равен 0, просто верните combo или что угодно еще.

tbTotesPerLayers.Text = SqIn == 0 : combo.ToString() ? (comBo / SqIn).ToString();


ZurdoDev

комбо.ToString () - это имя элемента управления в библиотеке .net. Что толку от этого в математической задаче?

Реальный вопрос заключается в том, что пользователь хочет, чтобы произошло, когда он равен 0. Надеюсь, просто сообщение об ошибке.

Ramza360

ни одна комбинация не является целым числом... Посмотрите на ОП

ZurdoDev

Ах, вы правы.

Philippe Mori

Идея правильная, но не отображаемый текст. Вы либо хотите оставить поле пустым, либо отобразить какой-то текст, который ясно показывает, что значение не может быть вычислено.

Рейтинг:
1

Patrice T

Оба

... (comBo / SqIn);

и
...combo / ((SqIn == 0) ? 0 : SqIn);

дают точно такой же результат, вторая форма ОС просто сложнее.

Правильный вопрос: "ожидаете ли вы SqIn быть нулем ? или нет ?"
Если вы ожидаете SqIn чтобы быть нулем, вы должны проверить его, прежде чем пытаться разделить.

В
int.TryParse(tbSqIn.Text, out SqIn);

Вы не проверяете, если TryParseв завершенных или нет.


ZurdoDev

TryParse будет true, а SqIn будет иметь 0 в том случае, если они ввели 0 в текстовое поле.

Рейтинг:
1

ZurdoDev

Как уже упоминалось в комментариях, сначала вам нужно проверить ноль. В разделе "Что я пробовал" вы написали код, который если SqIn равен 0, то делите на 0. Это утверждение избыточно и ничего не делает.

Трюк, который вы могли бы использовать, - это что-то вроде:

combo / (SqIn + 0.0000000001)


Это делает так, что деление на ноль, скорее всего, никогда не произойдет, и если вам не нужна большая точность в математике, это обходной путь.

Или просто проверьте 0. Простой.


0x01AA

Я не думаю,что "+ 0.0000000001" помогает.
a.) OP вычислить с помощью int
Б.) В зависимости от номинатора также + 0.0000000001 может закончиться проблемой (я думаю)...не уверен в этом пункте

Philippe Mori

А затем пользователь (или QA) решает попробовать протестировать -0.0000000001, и он снова падает. В этом случае обычно вы пишете пользовательскую строку ("", "-", "n/a",...) вместо этого и в какой-то момент выполняете проверку и показываете, что значение не является допустимым для пользователя.

ZurdoDev

О. почти уверен, что компилятор все еще позволяет это. Я в основном делаю этот трюк в SQL, чтобы избежать написания оператора case.
Б. Да, но кажется очень маловероятным, что это когда-нибудь произойдет.

Как уже упоминалось, проверка на 0 по-прежнему является лучшим вариантом.

0x01AA

убеждены +5

Рейтинг:
0

0x01AA

combo / ((SqIn == 0) ? 0 : SqIn)
означает
if (SqIn == 0)
  ... combo /0
else
  .... combo / SqIn


Я думаю, этого должно быть достаточно, чтобы решить ее.


Patrice T

"Я думаю, этого должно быть достаточно, чтобы решить эту проблему."
вы уверены, что это что-то решает ?

Philippe Mori

Даже оригинального кода должно было хватить... На самом деле, если ОП используется ?:- он должен знать, что она делает.

0x01AA

Вы правы :) Этого должно быть более "достаточно, чтобы признать основную проблему". Решение div на ноль очень сильно зависит от задачи.

0x01AA

Но я думаю, что именно это загадочное испытание является его единственным (по крайней мере, его большим) Проблема * смех*

уупс, только что признал, что мне не следует писать здесь, кто-то любит меня понижать :(