Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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中的Number.sign()_Javascript_Algorithm_Numbers_Sign - Fatal编程技术网

javascript中的Number.sign()

javascript中的Number.sign(),javascript,algorithm,numbers,sign,Javascript,Algorithm,Numbers,Sign,想知道有没有什么特别的方法可以找到数字的符号()? 可能比显而易见的解决方案更短/更快/更优雅 var sign = number > 0 ? 1 : number < 0 ? -1 : 0; 注意:符号(+-无限)->NaN,符号(“0”)->NaN Math.sign(3); // 1 Math.sign(-3); // -1 Math.sign('-3'); // -1 Math.sign(0); // 0 Math.sign(-0); //

想知道有没有什么特别的方法可以找到数字的符号()?
可能比显而易见的解决方案更短/更快/更优雅

var sign = number > 0 ? 1 : number < 0 ? -1 : 0;
注意:
符号(+-无限)->NaN
符号(“0”)->NaN

Math.sign(3);     //  1
Math.sign(-3);    // -1
Math.sign('-3');  // -1
Math.sign(0);     //  0
Math.sign(-0);    // -0
Math.sign(NaN);   // NaN
Math.sign('foo'); // NaN
Math.sign();      // NaN
在JS中,
Infinity
是一个合法的数字,这个解决方案似乎并不完全正确


3.艺术。。。但是非常慢[最慢]

function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
function sign(x) { return x && x / Math.abs(x); }
function sign(x) { return (x > 0) - (x < 0); }

5.类型安全[megafast]

function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }
function sign(x) { return x && x / Math.abs(x); }
function sign(x) { return (x > 0) - (x < 0); }
似乎是浏览器(尤其是chrome的v8)进行了一些神奇的优化,这个解决方案的性能比其他解决方案要好得多,甚至比(1.1)还要好,尽管它包含了2个额外的操作,而且从逻辑上讲永远不会更快

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}
功能标志(x){
返回类型x=='number'?x?x<0?-1:1:x===x?0:NaN:NaN;
}

工具
  • 性能测试
  • -类型铸造试验
欢迎改进


[Offtopic]接受的答案
  • -+100用于艺术,但遗憾的是,它比明显的方法慢5倍左右

  • -不知何故,这是(写作时)投票最多的答案,也有点酷,但这绝对不是事情应该怎么做,伊姆霍。而且它不能正确地处理无穷大的数字,你知道,它们也是数字

  • -是明显解决方案的改进。这不是革命性的,但我认为这是最好的方法。投他的票:)


将数字除以其绝对值也给出其符号。使用短路逻辑AND运算符允许我们使用特殊情况
0
,因此我们不会最终除以它:

var sign = number && number / Math.abs(number);

您可以对数字进行位移位并检查最高有效位(MSB)。如果MSB为1,则该数字为负数。如果为0,则数字为正(或0)

更优雅的fast解决方案版本:

var sign = number?number<0?-1:1:0

var sign=number?number调用您要查找的函数,实现它的最佳方法是:

function sgn(x) {
  return (x > 0) - (x < 0);
}
函数sgn(x){
返回(x>0)-(x<0);
}

我正要问同样的问题,但在写完之前就找到了解决方案,看到这个问题已经存在,但没有看到这个解决方案

(n>>31)+(n>0)


通过添加三元组(虽然
(n>>31)+(n>0?1:0)

它似乎更快,但是否应该不支持JavaScript(ECMAScript)的带符号零?在“megafast”函数中返回x而不是0时,它似乎起作用:

功能标志(x){
返回类型x=='number'?x?x<0?-1:1:x===x?x:NaN:NaN;
}
这使其与()的草稿兼容:

返回x的符号,指示x是正、负还是零

  • 如果x为NaN,则结果为NaN
  • 如果x是−0,结果是−0
  • 如果x为+0,则结果为+0
  • 如果x是负数,则−0,结果是−一,
  • 如果x为正而不是+0,则结果为+1

如果您不需要无穷大,并且知道数字是整数,可以在openjdk-7源代码中找到:
java.lang.integer.signum()

非常类似于Martijn的答案是

function sgn(x) {
    isNaN(x) ? NaN : (x === 0 ? x : (x < 0 ? -1 : 1));
}
函数sgn(x){
isNaN(x)?NaN:(x===0?x:(x<0?-1:1));
}

我觉得它更可读。此外(或者,取决于你的观点),它也会对一些可以解释为数字的东西进行摸索;e、 例如,当显示
'-5'
时,它返回
-1
,我想添加这个只是为了好玩:

function sgn(x){
  return 2*(x>0)-1;
}

0和NaN将返回-1
在+/-无穷大上运行良好

对于那些对最新浏览器的运行情况感兴趣的人来说,在ES6版本中有一个本机方法。你可以查一下电话号码

基本上,它返回
-1
1
0
NaN

Math.sign(3);     //  1
Math.sign(-3);    // -1
Math.sign('-3');  // -1
Math.sign(0);     //  0
Math.sign(-0);    // -0
Math.sign(NaN);   // NaN
Math.sign('foo'); // NaN
Math.sign();      // NaN

适用于所有数字以及
0
-0
,以及
无限
-Infinity
的解决方案是:

function sign( number ) {
    return 1 / number > 0 ? 1 : -1;
}
有关详细信息,请参阅问题“”



警告:这些答案,包括now标准,都不适用于案例
0
vs
-0
。这对您来说可能不是问题,但在某些物理实现中,这可能很重要。

我看不出从
数学返回-0和0有任何实际意义。符号
因此我的版本是:

function sign(x) {
    x = Number(x);
    if (isNaN(x)) {
        return NaN;
    }
    if (x === -Infinity || 1 / x < 0) {
        return -1;
    }
    return 1;
};

sign(100);   //  1
sign(-100);  // -1
sign(0);     //  1
sign(-0);    // -1
功能标志(x){
x=数量(x);
if(isNaN(x)){
返回NaN;
}
如果(x==-无穷大| 1/x<0){
返回-1;
}
返回1;
};
签署(100);//1.
符号(-100);//-1.
符号(0);//1.
符号(-0);//-1.

我知道的方法如下:

数学符号(n)

var s=Math.sign(n)

这是本机函数,但由于函数调用的开销,速度最慢。但是,它确实处理“NaN”,下面的其他人可能只假设0(即数学符号(“abc”)是NaN)

((n>0)-(n0)-(n>31)|(!!n)

var s=(n>>31)|(!!n);

使用“符号传播右移位”。基本上移位31会删除符号以外的所有位。如果设置了符号,则结果为-1,否则为0。
的右侧通过将值转换为布尔值(0或1[BTW:非数字字符串,如
!!'abc'
,在本例中变为0,而不是NaN])然后使用按位OR操作组合位

这似乎是所有浏览器中最好的平均性能(至少在Chrome和Firefox中最好),但不是所有浏览器中最快的


n?n我的两分钱,带有一个返回与Math.sign相同结果的函数,即sign(-0)-->-0,sign(-无穷大)-->-Infinity,sign(null)-->0,sign(未定义)-->NaN,等等

function sign(x) {
    return +(x > -x) || (x && -1) || +x;
}
Jsperf不会
Math.sign = Math.sign || function(number){
    var sign = number ? ( (number <0) ? -1 : 1) : 0;
    return sign;
};