JavaScript中获取数字的符号的最简单方法是什么?

9

可能是重复的问题:
在javascript中使用Number.sign()

给定一个数字变量,如何最简单地确定它的符号?

我不断地得到这样的代码:

var direction = (vector[0] > 0) ? 1: (vector[0] < 0) ? -1: 0;

当我想要的是:如果数字为负数,则输出-1,如果为正数,则输出1,如果为0,则输出0时,似乎不太优雅。

所谓“最简单”,实际上指的是优美或者输入较少的方式。

或者,也许有一种方法可以绝对地增加一个值。例如,如果数字为负数,则从中减去1;如果数字为正数,则将其中加1。Math.abs()提供了绝对值,但是一旦运行Math.abs()后,就没有办法将其转换回有符号的数字。


使用ES6,您可以使用Math.sign():https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign但是由于实现方式,它有一个不幸的边缘情况:Math.sign(-0) === Math.sign(+0) - johncip
4个回答

15
您可以这样做:
var sign = number && number / Math.abs(number);

2
我对你的帖子进行了一次表面编辑,以回滚无正当理由的负评。 - Tomasz Nurkiewicz
这种方法在基准测试中几乎总是比基于比较的方法慢得多,因为除法非常慢。 - Eric Grange

4
如何定义一个函数来完成这个任务?
sign = function(n) { return n == 0 ? 0 : n/Math.abs(n); }

1
难道不是与 return n || n/Math.abs(n) 相同吗? - elclanrs
你甚至可以将其猴子补丁到Math中,也许称之为sgnsignum更具数学意义。 - Mark Reed
@elcanrs 不,那正好相反 - 它只有在 n 零时才进行除法运算。 - Mark Reed
@MarkReed:嗯,找到了一个好的重复内容。 - Madara's Ghost
@MarkReed:对,return n && n/Math.abs(n) 怎么样? - elclanrs
显示剩余2条评论

2

您可以将数字除以其绝对值,即可得到其符号:

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

2
当数字为0时怎么办? - Jamie Wong
@JamieWong 你说得对。我更新了我的代码。 - Kirill Ivlev
哇,而且 && 处理了 0。非常好的答案! - BishopZ

2

如果您想要一种更简短的方式,并且知道它是一个数字,并且不介意被限制在有符号32位范围内,您可以这样做:

n ? -(n >>> 31) || 1 : 0;

  • 如果n0,则返回0
  • 如果 n >>> 311,则它是有符号的,因此为负数,并将被取反为-1
  • 如果 n >>> 310,则它是无符号的,因此为正数,并默认为1

注意:这假设 n 是 Int32,而不是 Long,并且对于负的 n < -(2**31 + 1) 将会失败。 - Paul S.
1
@PaulS.:是的,我在我的回答中注意到了范围限制。 :) - I Hate Lazy
我没有将其标记为正确答案,因为对于大多数人来说它不是非常直观,但是哇,它非常简短。我真的很喜欢这种方法,感谢您发布它! - BishopZ
@BishopZ:谢谢。我刚刚意识到我多了一个字符,所以我更新了它。你说得对,这不是最直观的代码。我主要是出于好奇想看看我能想出什么来。 :-) - I Hate Lazy
请注意,如果-1 < x < 0,则此方法会失败。将其转换为整数会四舍五入为0,并且符号会丢失。 - jjrv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接