ユーザー入力を受け入れるJavaScriptで0による除算を防ぐ最善の方法は何ですか。これを達成する特定の方法がない場合、他のスクリプトの実行を妨げないように、そのような状況を処理するための最良の方法は何でしょうか?
どんな洞察も大歓迎です。
通常の/
および/=
演算子でこれを行う方法はありません。
あなたが望むことをする最善の方法はガードを使うことです:
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;
を使用できます。分母がゼロかどうかを確認しないのはなぜですか?
if(x != 0) z = y / x;
結果が無限大かどうかを確認することもできます。
3 / 0 == Infinity
結果はtrue
になります。
(Chromeでのみテストされています。)
最善の方法は、状況に応じたものです。しかし、これが最も簡単です。
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
を使用できます。
実行の停止とは少し異なりますが、3項演算子は変数の割り当てをカスタマイズするための非常に洗練された方法です。
var one = 1,
zero = 0,
customValue = 1;
var quotient = zero===0 ? customValue : one / zero;
このように、customVariableを任意の整数に設定することにより、ゼロ除算が発生したときに予測可能な結果を期待できます。