Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中防止/处理除以0的最佳方法_Javascript_Divide By Zero - Fatal编程技术网

在javascript中防止/处理除以0的最佳方法

在javascript中防止/处理除以0的最佳方法,javascript,divide-by-zero,Javascript,Divide By Zero,在接受用户输入的javascript中,防止被0除的最佳方法是什么。 如果没有特定的方法来实现这一点,那么处理这种情况的最佳方法是什么,以避免阻止其他脚本执行 非常感谢您的任何见解。为什么不检查分母是否为零 if(x != 0) z = y / x; 您还可以检查结果是否为无穷大: 3 / 0 == Infinity 结果为true (仅在chrome中测试。)为什么不检查分母是否为零 if(x != 0) z = y / x; 您还可以检查结果是否为无穷大: 3 / 0 == Infin

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


非常感谢您的任何见解。

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

if(x != 0) z = y / x;
您还可以检查结果是否为无穷大:

3 / 0 == Infinity
结果为
true


(仅在chrome中测试。)

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

if(x != 0) z = y / x;
您还可以检查结果是否为无穷大:

3 / 0 == Infinity
结果为
true


(仅在chrome中测试。)

在我的头顶上,您可以:

  • 检查用户输入以查看分母是否为零(或根据脚本实际执行的操作计算为零)
  • 检查行动结果是否正确,如果不正确,则进行适当处理

  • 在我的脑海里,你可以:

  • 检查用户输入以查看分母是否为零(或根据脚本实际执行的操作计算为零)
  • 检查行动结果是否正确,如果不正确,则进行适当处理

  • 使用正常的
    /
    /=
    运算符无法做到这一点

    做你想做的事情的最好方法是使用警卫:

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

    但是,这会失去
    /=

    的可读性和表达能力,使用正常的
    /
    /=
    操作符无法做到这一点

    做你想做的事情的最好方法是使用警卫:

    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;
    }
    
    但这会失去
    /=

    的可读性和表达能力,从而防止(不必要的)执行
  • 始终验证关键用户输入和/或结果
  • 使用可以阻止执行的逻辑和/或回调
  • 在HTML表单等上,您可以使用,即
    返回false作为停止提交的值
  • 阻止(不必要的)执行
  • 始终验证关键用户输入和/或结果
  • 使用可以阻止执行的逻辑和/或回调
  • 在HTML表单等上,您可以使用,即
    返回false作为停止提交的值
  • 为了不妨碍其他脚本的执行,处理这种情况的最佳方法是什么

    除零似乎不会阻止其他脚本在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;
      }
    }
    
    为了不妨碍其他脚本的执行,处理这种情况的最佳方法是什么

    除零似乎不会阻止其他脚本在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;
      }
    }
    

    与停止执行略有不同,但三元运算符是定制变量赋值的一种非常灵活的方法

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

    通过这种方式,通过将customVariable设置为您选择的整数,当发生除零时,您可以预期一个可预测的结果。

    与停止执行略有不同,但三元运算符是定制变量分配的一种非常灵活的方法

    var one = 1,
        zero = 0,
        customValue = 1;
    
    
    var quotient = zero===0 ? customValue : one / zero;
    
    这样,通过将customVariable设置为您选择的整数,当发生除零时,您可以预期一个可预测的结果。

    希望这是有用的

    (denominator != 0 ? numerator/denominator : Infinity)
    
    或者你想在结尾加上的任何值

    您好。

    希望这是有用的

    (denominator != 0 ? numerator/denominator : Infinity)
    
    或者你想在结尾加上的任何值


    问候语。

    最好的方式是语境。但这里是最简单的:

    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、number、string、object),如果无效或为零,则返回类似于故障保护零的值。它还将强制输出为一个数字,以防它是一个字符串,而您正在做一些奇怪的事情。所有这些都将确保除数函数始终有效。最后,对于希望自己处理此类错误的情况,可以将第二个参数设置为true,并使用
    try/catch

    最佳方法是上下文。但这里是最简单的:

    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、number、string、object),如果无效或为零,