web-dev-qa-db-ja.com

JavaScriptで0による除算を防止/処理する最良の方法

ユーザー入力を受け入れるJavaScriptで0による除算を防ぐ最善の方法は何ですか。これを達成する特定の方法がない場合、他のスクリプトの実行を妨げないように、そのような状況を処理するための最良の方法は何でしょうか?

どんな洞察も大歓迎です。

24
dibs

通常の/および/=演算子でこれを行う方法はありません。

あなたが望むことをする最善の方法はガードを使うことです:

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;
}

しかし、それは/=の読みやすさと表現力を失います。

20
Mike Samuel

私の頭の上からできること:

  1. ユーザー入力をチェックして、分母がゼロかどうかを確認します(または、スクリプトの実際の動作に応じて、ゼロに評価されます)。
  2. アクションの結果 isFinite() かどうかを確認し、そうでない場合は適切に処理します。
5
maerics

他のスクリプトの実行を妨げないように、そのような状況を処理するための最良の方法は何でしょうか

ゼロによる除算は、他のスクリプトが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
am2124429

これが役に立てば幸い

(denominator != 0 ? numerator/denominator : Infinity)

または最後に置きたい値。

こんにちは。

2
AlexMethod

(不要な)実行を防止するには

  1. 常に検証クリティカルユーザー入力および/または結果
  2. 実行を防止できるロジックやコールバックを使用する
  3. HTMLフォームなどでは、送信を停止する値としてreturn false;を使用できます。
2
Smamatti

分母がゼロかどうかを確認しないのはなぜですか?

if(x != 0) z = y / x;

結果が無限大かどうかを確認することもできます。

3 / 0 == Infinity

結果はtrueになります。

(Chromeでのみテストされています。)

1
GAgnew

最善の方法は、状況に応じたものです。しかし、これが最も簡単です。

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; }
}

これはany値(null、number、string、object)を取り、無効またはゼロの場合、フェイルセーフのゼロに似た値を返します。また、文字列で奇妙なことをした場合に備えて、出力を数値に強制変換します。これにより、除数関数が常に機能することが保証されます。最後に、このようなエラーを自分で処理したい場合は、2番目のパラメーターをtrueに設定し、try/catchを使用できます。

0
Beejor

実行の停止とは少し異なりますが、3項演算子は変数の割り当てをカスタマイズするための非常に洗練された方法です。

var one = 1,
    zero = 0,
    customValue = 1;


var quotient = zero===0 ? customValue : one / zero;

このように、customVariableを任意の整数に設定することにより、ゼロ除算が発生したときに予測可能な結果を​​期待できます。

0
ShaneSauce