Можно ли заставить делить на нули возвращать число, вместо того, чтобы выдавать исключение? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть выражение, которое включает деления, для которых некоторые знаменатели иногда равны нулю. Однако в этих случаях я хотел бы, чтобы это деление приводило к 1, а не к исключению. Есть ли прямой способ сделать это, или я вынужден сделать некоторые операторы if и изменить входные данные для выражения, чтобы получить желаемый эффект?

Ответы [ 8 ]

7 голосов
/ 21 сентября 2011

Хотя я должен поставить под сомнение мотивы здесь, если вам нужно сделать это, сделайте функцию.

double SafeDiv(double num, double denom) {
   if(denom == 0) {
      return 1;
   }
   return num/denom;
}
1 голос
/ 21 сентября 2011

Как то так?

public T divide<T>(T dividend, T divisor) {
    return ((divisor == 0) ? (1) : (dividend / divisor));
}

или, возможно ...

public T divide<T>(T dividend, T divisor) {
    try {
        return dividend / divisor;
    }
    catch (DivideByZeroException) {
        return 1;
    }
}

Лично, если вы знаете, что делитель может быть 0 в некоторых случаях, я бы не считал этот случай «исключительным» и, таким образом, использовал бы первый подход (который также, довольно удобно, может быть встроен вручную, если вы так склонны) ).

Тем не менее, я согласен с тем, что написал Крис Марасти-Георг , и ставлю под сомнение мотивы для этого.

1 голос
/ 21 сентября 2011

Поскольку невозможно переопределить оператор деления для встроенных типов, вам необходимо реализовать свою версию деления в функции.

1 голос
/ 21 сентября 2011

Вы можете написать функцию для деления.Вот пример расширения идеи:

public static float DivideBy(this float toBeDivided, float divideBy){
    try
    {
    return toBeDivided / divideBy;
    }
    catch(DivideByZeroException)
    {
    return 1.0;
    }
}
0 голосов
/ 21 сентября 2011

Может быть, вы могли бы попробовать это

    double res = a / (b == 0 ? a : b);
0 голосов
/ 21 сентября 2011

Если делитель или делитель являются двойными, а делитель равен 0 (или 0,0), результат является положительной или отрицательной бесконечностью.Он будет проходить через все последующие операции без выброса и вместо этого возвращает ± Infinity или NaN, в зависимости от другого операнда.Позже вы можете проверить, является ли окончательное значение чем-то значимым.

Если по какой-то причине необходимо вернуть 1 при делении на ноль, у вас есть несколько вариантов:

  • Пользовательская универсальная функция
  • Пользовательский тип с перегруженными операторами
  • Проверьте, равен ли делитель 0 перед делением

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

0 голосов
/ 21 сентября 2011

Сначала проверьте знаменатель, если он не равен нулю, выполните операцию

public double ReturnValueFunction(int denominator, int numerator)
{
    try
    {
       if(denominator!=0)
       {
             return  numerator/ denominator; 

         /* or your code */
        }

  else
   {
            /*your code*/
        return someDecimalnumber;
   }
}
    catch(Exception ex)
    {

    }
}
0 голосов
/ 21 сентября 2011

Нет. Если я понимаю ваш вопрос, вы хотели бы изменить поведение операции деления и вернуть 1 вместо throw. Нет способа сделать это.

...