ユーザー入力を受け入れるJavaScriptでゼロ除算を防ぐための最良の方法は何ですか。これを達成するための特別な方法がない場合、他のスクリプトの実行を妨げないように、そのような状況を処理するための最良の方法は何でしょうか?
どんな洞察も大歓迎です。
ユーザー入力を受け入れるJavaScriptでゼロ除算を防ぐための最良の方法は何ですか。これを達成するための特別な方法がない場合、他のスクリプトの実行を妨げないように、そのような状況を処理するための最良の方法は何でしょうか?
どんな洞察も大歓迎です。
/
通常の演算子と演算子でそれを行う方法はありません/=
。
あなたが望むことをするための最良の方法は警備員を使うことです:
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;
}
しかし、それはの読みやすさと表現力を失い/=
ます。
私の頭のてっぺんからあなたはできる:
isFinite()
そうでない場合は適切に処理します。他のスクリプトの実行を妨げないように、このような状況を処理するための最良の方法は何でしょうか。
ゼロ除算は、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;
}
}
これがお役に立てば幸いです
(denominator != 0 ? numerator/denominator : Infinity)
または最後に置きたい値。
ご挨拶。
return false;
HTMLフォームなどでは、送信を停止するための値としてieを使用できます。分母がゼロかどうかを確認してみませんか?
if(x != 0) z = y / x;
結果がInfinityであるかどうかを確認することもできます。
3 / 0 == Infinity
結果はtrue
;
(クロムでのみテストされています。)
実行を停止するのとは少し異なりますが、三項演算子は変数の割り当てをカスタマイズするための非常に巧妙な方法です。
var one = 1,
zero = 0,
customValue = 1;
var quotient = zero===0 ? customValue : one / zero;
このように、customVariableを選択した整数に設定することにより、ゼロ除算が発生したときに予測可能な結果を期待できます。
最善の方法は状況に応じたものです。しかし、これが最も簡単な方法です。
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
。