31

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

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

4

8 に答える 8

27

/通常の演算子と演算子でそれを行う方法はありません/=

あなたが望むことをするための最良の方法は警備員を使うことです:

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

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

于 2011-11-09T22:02:28.673 に答える
8

私の頭のてっぺんからあなたはできる:

  1. ユーザー入力をチェックして、分母がゼロであるかどうかを確認します(または、スクリプトの実際の動作によっては、ゼロと評価されます)。
  2. アクションの結果を確認し、isFinite()そうでない場合は適切に処理します。
于 2011-11-09T22:02:02.770 に答える
5

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

ゼロ除算は、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;
  }
}
于 2015-11-05T11:56:22.507 に答える
3

これがお役に立てば幸いです

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

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

ご挨拶。

于 2018-06-29T15:29:12.790 に答える
2

(不要な)実行を防ぐため

  1. 重要なユーザー入力や結果を常に確認する
  2. 実行を防ぐことができるロジックやコールバックを使用する
  3. return false;HTMLフォームなどでは、送信を停止するための値としてieを使用できます。
于 2011-11-09T22:02:37.863 に答える
1

分母がゼロかどうかを確認してみませんか?

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

結果がInfinityであるかどうかを確認することもできます。

3 / 0 == Infinity

結果はtrue;

(クロムでのみテストされています。)

于 2011-11-09T22:01:41.013 に答える
0

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

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


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

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

于 2017-08-29T19:38:01.940 に答える
0

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

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

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

于 2018-09-13T00:16:03.293 に答える