2015-04-29 4 views
2

Я новичок в программировании, и у меня есть проблема с делением на ноль. Проблема объясняется в комментарии в коде.Divide by zero return infin

public float Divide (float a, float b) 
{ 
    if (!Equals (b, 0)) 
     return a/b; 
    else 
     return 0; // what should this return contains not to giving me back infinite? 
        // But for example message that you can't divide by zero? 
} 
+0

Все, что вы хотите. Вы просите об исключениях? – SLaks

+2

Несвязанное примечание: вы должны быть осторожны, сравнивая числа с плавающей точкой для равенства. Как правило, вы никогда не должны этого делать, поскольку это очень вероятно, что это приведет к неправильным последствиям из-за проблем с высокой точностью. – n0rd

ответ

7

Вы не должны возвращаться 0. Вы должны вернуть float.NegativeInfinity (если a отрицательный) или float.PositiveInfinity (если a положительна), и float.NaN если оба a и b равны 0. Заметим, что это одно и то же поведение что вы получите, если вы сделали это в вашем коде:

return a/b; 

Таким образом, вы можете захотеть, чтобы просто изменить код следующим образом:

public float podil (float a, float b) { 
    return a/b; 
} 

Если деление на 0 представляет собой определенное незаконное условие в вашем приложении, и вы не хотите, чтобы значения float.NaN распространялись, вы должны выбросить исключение. Как:

public float podil (float a, float b) { 
    var result = a/b; 
    if (float.IsNan(result)) 
     throw new DivideByZeroException(); // or a different exception type. 
    return result; 
} 

Смотрите эту fiddle, он вернется float.PositiveInfinity.

+0

Я уверен, что он выкинет исключение «DivideByZero», а не возвращает postive/negative infinity – BradleyDotNET

+3

@BradleyDotNET не для поплавков; они возвратят бесконечность для деления на ноль (или NaN для 0/0). Целочисленное деление будет генерировать деление на нулевое исключение. – Erik

+1

@Erik Спасибо за информацию, узнайте что-нибудь каждый день. – BradleyDotNET

1

Это зависит от вас, что вернуть, если вы не любите по умолчанию ... Обычно можно было бы исключить исключение, но это не «возврат».

Наиболее близкий ответ будет вернуться nullablefloat? -

public float? podil (float a, float b) 
{ 
    return b == 0 ? (float?) null : a/b; 
} 

Вы можете также рассмотреть double.PositiveInfinity, но дело с исключениями или обнуляемыми типами, как правило, проще.

Примечание: будьте осторожны с сравнением чисел с плавающей точкой в ​​0 (либо с Equals или ==) из-за возможных проблем округления в предыдущих расчетах - Is it wrong to compare a double to 0 like this: doubleVariable==0?)

0

Что такое результат, который вы хотите? Бесконечное значение? Для float нет ни одного. Не вызывайте метод, если b равен нулю, если вы не хотите получить конкретный результат.

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

public float Divide (float a, float b) 
{ 
    return Equals (b, 0) ? float.NegativeInfinity : a/b; 
}