Javascript 检查两个整数的符号是否相同

Javascript 检查两个整数的符号是否相同,javascript,Javascript,我正在寻找一种有效的方法来检查两个数字是否有相同的符号 基本上,我在寻找一种比这更优雅的方式: var n1 = 1; var n2 = -1; ( (n1 > 0 && n2 > 0) || (n1<0 && n2 < 0) )? console.log("equal sign"):console.log("different sign"); var n1=1; var n2=-1; (n1>0&&n2>0)| |(n1您可以将它们相

我正在寻找一种有效的方法来检查两个数字是否有相同的符号

基本上,我在寻找一种比这更优雅的方式:

var n1 = 1;
var n2 = -1;

( (n1 > 0 && n2 > 0) || (n1<0 && n2 < 0) )? console.log("equal sign"):console.log("different sign");
var n1=1;
var n2=-1;

(n1>0&&n2>0)| |(n1您可以将它们相乘;如果它们具有相同的符号,结果将为正

bool sameSign = (n1 * n2) > 0

代码的字符数较少,但可能会溢出:

n1*n2 > 0 ? console.log("equal sign") : console.log("different sign or zero");
或无整数溢出,但稍大:

(n1>0) == (n2>0) ? console.log("equal sign") : console.log("different sign");

如果你认为0是正的,则应该用< P>代替,否则正则表达式就应该起作用。

function isNegative(num) { 
        if (num.match(/^-\d+$/)) {
            return true;
        } else {
            return false;
        }
   }


function isSameSign(num1, num2) { 
        var sameSign = false;  
        if (num1.match(/^-\d+$/) && num2.match(/^-\d+$/) ) {
                sameSign = true;
            } else if(!num2.match(/^-\d+$/) && !num2.match(/^-\d+$/)) {
                sameSign =true;
            }
        return sameSign;
       }
使用按位异或

n1^n2 >= 0 ? console.log("equal sign") : console.log("different sign");
简单易用:

bool sameSign = ((n1 < 0) == (n2 < 0)); 
boolsamesign=((n1<0)==(n2<0));

基于您如何为特殊值定义“相同符号”:

  • NaN
    NaN
    是否有相同的符号
如果您的回答是“否”,则答案是:

Math.sign(a) === Math.sign(b)
Object.is(Math.sign(a) + 0, Math.sign(b) + 0)
如果您的回答是“是”,那么答案是:

Math.sign(a) === Math.sign(b)
Object.is(Math.sign(a) + 0, Math.sign(b) + 0)


如果
n1
n2
都是正整数,但将它们相乘会导致整数过小,该怎么办?@ThorstenDittmar我担心有人会指出这一点;)--在这种情况下,@ThorstenDittmar这个问题在我的情况下不会发生,但值得指出。如果
n1
n2
都为零,该怎么办?@ThorstenDittmar JavaScript永远不会导致数字类型上的整数溢出,因为它们不是“整数”是的,它们是float,IEEE 754 float。这不是JavaScript,但我想所有这些工作都是:。@FelixKling是的,我读了这个问题,但在接受的答案前停了下来,我对此不满意;)嗯,在我看来这很酷:
return((x@FelixKling没错,这是“接受答案后不要停止阅读”的另一个例子如果
n1
n2
都是正整数,但将它们相乘会导致整数超限,那该怎么办?比第一个版本失败。因此,我添加了一个更健壮但稍大的版本。通过使用此表达式,您需要假设n1和n2都是数字类型,而不是NaN。溢出无关紧要。(无穷大可以正常工作。)但是下溢是这样的。如果
n1
n2
都是正整数,但相乘会导致整数超限呢?同意。这可能是一个问题。这只返回一个数字是否为假。如果要这样做,只需检查
num>0
——要先将字符串转换为数字,可以执行
parseInt(个)>0
这只需要一个调整。我已经更新并给出了第二个版本来展示如何修改第一个函数以达到要求,但是你仍然使用一个脆弱的正则表达式而不是内置的
parseInt
方法。即使
返回num1=0;
<0
进行更好和更短的测试也会让它变得更简单ar较小;)而不是添加新答案(对一个4岁的已回答问题)为什么不直接给给出准确答案的人一个向上投票的机会呢?Tnx 4你的评论。尽管有类似的概念,但我不认为它们是完全相同的,所以我发布了我的,以备将来参考。顺便说一句,谢谢你提出的好问题。我提前向上投票这甚至不是JavaScript…不幸的是,正确答案是“Yes”和“Yes”,因此这种方法不是特别有用(除此之外,调用
Math
对象来完成如此琐碎的任务并不实际).@Christoph YY和NN已添加到答案中。@Christoph我无法理解您为什么不希望在ES规范中使用方法。您不需要向任何第三方代码添加依赖项,它们应该比其他人编写的大多数代码工作得更好。您可能会说此任务“微不足道”,但我没有找到正确处理这些边缘问题的其他答案。您可以说“我的问题不关我的事”,但这不应该是“正确的”回答这个问题。我删除了
+-0
部分,因为规范清楚地说明了如何处理这个问题。我想你误解了我的评论-我知道这是一个本机对象,我只是认为,如果有更简单的解决方案(除此之外,我正在寻找一个简短的解决方案),那么使用它是“过火”的.尽管如此,我还是对你的“开箱即用”方案投了赞成票。