检测数字是从负数变为正数还是从正数变为负数

时间:2014-01-10 13:57:07

标签: javascript numbers sign

如何检测正面或负面变化?

示例:

1更改为2 = false

0更改为1 = false

因为两者都是正数

1更改为-1 = true

0更改为-1 = true

因为积极变为负面

-1更改为0 = true

-1更改为1 = true

因为负面改变为正面

我喜欢..

var a_test,b_test;
if(a<0) {
    a_test = 'negative';
} else {
    a_test = 'positive';
}
if(b<0) {
    b_test = 'negative';
} else {
    b_test = 'positive';
}

if(a_test!==b_test) {
    alert('Yeah!');
}

进行测试: http://jsfiddle.net/e9QPP/

更好的编码可以做这样的事情吗?


Wiki:负数是一个小于零的实数

5 个答案:

答案 0 :(得分:5)

根据Zen of Python

  

可读性计数。

所以,我提出了更具可读性和代码审查的传递版本

if (a < 0 && b >= 0 || a >= 0 && b < 0) {
    alert("Yeah");
}

答案 1 :(得分:4)

你似乎想要

if (a*b<0) alert('Yeah!');

如果您想将0视为正数,可以使用

if (a*b<0 || (!(a*b) && a+b<0)) alert('Yeah!');

答案 2 :(得分:3)

采取suitable sign function

function sign(x) {
  return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}

然后你的问题可以用清晰的(希望)简单的术语来表达:

if (sign(a) !== sign(b)) {
  // Your code here
}

答案 3 :(得分:1)

根据您的标准,您似乎只想比较两个数字的符号。符号存储在数字的最高位,因此,为了比较符号,我们可以简单地将所有其他位移出数字,并比较符号。

JavaScript中的数字是64位(double),所以我们需要移开符号前面的63位:

if (a >>> 63 !== b >>> 63) alert('Yeah!');

这是jsFiddle demo

这里提供jsPerf comparison based on the 4 methods

请注意,这假设数字是64位。我不知道规范是否将它限制为64位,但是有些浏览器可能会出现(或将会是一天),数字可能由128位数或更大数字表示。

答案 4 :(得分:1)

也许有点晚了,但我遇到了同样的问题。

假设你现在a和b是数字,为什么不呢:

if(a < 0 ? b >=0 : b < 0){
   // your code here
}