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

问题描述 投票:19回答:8

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

任何见解都非常感谢。

javascript divide-by-zero
8个回答
18
投票

使用普通的//=操作符无法做到这一点。

做你想要的最好的方法就是守卫:

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

但这会失去/=的可读性和表现力。


5
投票

在我的头顶,你可以:

  1. 检查用户输入以查看分母是否为零(或评估为零,具体取决于您的脚本实际执行的操作)。
  2. 检查动作isFinite()的结果是否正确处理。

4
投票

什么是处理这种情况的最佳方法,以便不阻止其他脚本执行

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

2
投票

To prevent (unwanted) execution

  1. 始终验证关键用户输入和/或结果
  2. 使用可以阻止执行的逻辑和/或回调
  3. 在HTML表单等上,您可以使用ie return false;作为值来停止提交。

1
投票

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

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

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

3 / 0 == Infinity

结果在true;

(仅在镀铬中测试过。)


1
投票

希望这很有用

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

或者你想放在最后的任何价值。

问候。


0
投票

与停止执行有点不同,但三元运算符是一种非常灵活的自定义变量赋值方式。

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


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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.