Лучший способ предотвратить/обработать деление на 0 в javascript
Каков наилучший способ предотвратить деление на 0 в javascript, который принимает входные данные пользователя.
Если нет особого пути для достижения этого, что было бы лучшим способом справиться с такой ситуацией, чтобы не препятствовать выполнению других скриптов?
Любые идеи очень ценятся.
Ответы
Ответ 1
Это невозможно сделать с помощью обычных операторов /
и /=
.
Лучший способ сделать то, что вы хотите, это с помощью охранников:
function notZero(n) {
n = +n; // Coerce to number.
if (!n) { // Matches +0, -0, NaN
throw new Error('Invalid dividend ' + n);
}
return n;
}
а затем делите, как
numerator / notZero(denominator)
В качестве альтернативы вы всегда можете охранять вывод
function dividend(numerator, denominator) {
var quotient = numerator / denominator;
if (quotient !== quotient) { throw new Error(numerator + " / " + denominator); }
return quotient;
}
но это теряет читабельность и выразительность /=
.
Ответ 2
Сверху моей головы можно:
- Проверьте вход пользователя, чтобы узнать, равен ли знаменатель нулю (или оценивается до нуля, в зависимости от того, что на самом деле делает ваш script).
- Убедитесь, что результат действия
isFinite()
, и если нет, тогда обработайте его соответствующим образом.
Ответ 3
что было бы лучшим способом справиться с такой ситуацией, чтобы не препятствовать выполнению других сценариев
Деление на ноль, похоже, не предотвращает выполнение других сценариев в JavaScript:
var a = 20;
var b = 0;
var result = a/b;
console.log(result); // returns Infinity
Если вам нужно что-то другое в случае деления на ноль, вы можете использовать
function divideIfNotZero(numerator, denominator) {
if (denominator === 0 || isNaN(denominator)) {
return null;
}
else {
return numerator / denominator;
}
}
Ответ 4
Чтобы предотвратить (нежелательное) выполнение
- Всегда проверяйте критический пользовательский ввод и/или результаты
- Использовать логику и/или обратные вызовы, которые можно предотвратить для выполнения
- В форматах HTML и т.д. вы можете использовать i.e.
return false;
как значение для прекращения подачи.
Ответ 5
Надеюсь, это полезно
(denominator != 0 ? numerator/denominator : Infinity)
или любое другое значение, которое вы хотите поставить в конце.
Приветствую.
Ответ 6
Почему бы просто не проверить, равен ли знаменатель нулю?
if(x != 0) z = y / x;
Вы также можете проверить, является ли результат Бесконечность:
3 / 0 == Infinity
Результаты в true
;
(Проверяется только на хром.)
Ответ 7
Немного отличается от остановки выполнения, но тернарный оператор является довольно гладким способом настройки присваивания переменной.
var one = 1,
zero = 0,
customValue = 1;
var quotient = zero===0 ? customValue : one / zero;
Таким образом, установив customVariable на целое число по вашему выбору, вы можете ожидать прогнозируемого результата при делении на ноль.
Ответ 8
Лучший способ - контекстный. Но тут самое простое:
function myFunction( input ){
input = 0 ? 0.0001 : input; // same as if( input == 0 ){ input = 0.0001; }
return 1 / input;
}
В основном, если ввод равен нулю, превратите его в очень маленькое число, прежде чем использовать в качестве знаменателя. Прекрасно работает с целыми числами, поскольку после деления вы можете округлить их обратно.
Несколько предостережений мешают этому быть универсальными:
- Это может привести к ложным срабатываниям, если ваш ввод принимает действительно маленькие числа
- Он не вызовет никакого кода обработки ошибок, если вам нужно сделать что-то особенное, если введен ноль
Так что лучше всего подходит для некритических случаев общего назначения. Например, если вам нужно вернуть результат сложного вычисления, и вам все равно, точен ли ответ до N цифр (определяется как 0,0001 против 0,00000001 и т.д.); вы просто не хотите, чтобы оно делилось на деление на ноль.
Как показал другой ответ, вы также можете создать глобальную функцию многократного использования.
function divisor( n ){ return ( n = 0 ? 0.0001 : n ); }
function myFunction( input ){ return 1 / divisor( input ); }
Возможные улучшения:
function divisor( n, orError ){
if( typeof n == 'undefined' || isNaN( n ) || !n ){
if( orError ){ throw new Error( 'Divide by zero.' ); }
return 0.000000000000001;
}else{ return 0 + n; }
}
Это будет принимать любое значение (ноль, число, строка, объект) и, если оно неверно или равно нулю, возвращает отказоустойчивое нулевое значение. Это также приведет к выводу числа на случай, если это будет строка и вы делаете что-то странное. Все это гарантирует, что ваша функция делителя всегда работает. Наконец, для случаев, когда вы хотите обрабатывать такие ошибки самостоятельно, вы можете установить для второго параметра значение true и использовать try/catch
.