31

在接受用户输入的javascript中防止被0除的最佳方法是什么。如果没有特定的方法来实现这一点,那么处理这种情况以免阻止其他脚本执行的最佳方法是什么?

非常感谢任何见解。

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. 在 HTML 表单等上,您可以使用 iereturn false;作为停止提交的值。
于 2011-11-09T22:02:37.863 回答
1

为什么不检查分母是否为零?

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

您还可以检查结果是否为 Infinity:

3 / 0 == Infinity

结果true

(仅在 chrome 中测试。)

于 2011-11-09T22:01:41.013 回答
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、数字、字符串、对象),如果无效或为零,则返回类似零的故障安全值。它还会强制输出为一个数字,以防万一它是一个字符串并且你正在做一些奇怪的事情。所有这些都将确保您的除数函数始终有效。最后,对于您想自己处理此类错误的情况,您可以将第二个参数设置为 true 并使用try/catch.

于 2018-09-13T00:16:03.293 回答
0

与停止执行有点不同,但三元运算符是自定义变量分配的一种非常巧妙的方法。

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


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

这样,通过将 customVariable 设置为您选择的整数,您可以在除以零时获得可预测的结果。

于 2017-08-29T19:38:01.940 回答