2012-11-19 68 views
8

可能重複:
Number.sign() in javascriptJavascript中最簡單的方法是隻獲取數字的符號是什麼?

鑑於一些號的變量,什麼是確定它的標誌最簡單的方法?

我跟上代碼結束了像這樣:

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

似乎小於優雅,當所有我要的是-1,如果是負數,1表示正,0,如果是0

「最簡單」我的意思是優雅或少打字。

或者,也許有一種方法可以絕對增加一個值。就好像這個數字是負數,然後從它減去1,如果是正數就加1。 Math.abs()提供絕對值,但運行Math.abs()後無法將其轉換回有符號數。

+0

隨着ES6您可以用'Math.sign()':https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/sign 但是由於實現它有一個不幸的邊緣情況:'Math.sign(-0)=== Math.sign(+0) ' – johncip

回答

14

你可能只是這樣做:

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

爲了回滾不合理的downvote,我對你的帖子做了一個整型編輯。 –

+0

這種方法在基準測試中比基於比較的方法慢得多,分區必須很慢。 –

2

您可以通過它絕對把數,你會得到符號:

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

數字爲0時怎麼辦? –

+0

@JamieWong你是對的。更新我的代碼 –

+0

哇,&&照顧0.很好的答案! – BishopZ

4

如何定義一個函數來做到這一點?

sign = function(n) { return n == 0 ? 0 : n/Math.abs(n); } 
+1

難道它不會和'return n ||一樣嗎? N/Math.abs(n)的'? – elclanrs

+0

你甚至可以將它修改成數學,也可以稱之爲'sgn'或'signum'以使其更具數學性。 –

+0

@elcanrs不,這與你想要的相反 - 它只在n *爲*零時才進行分割。 –

1

如果你想有一個更短的路,你知道這是一個數字,你不介意被限制在32位有符號範圍內,你可以這樣做:

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

  • 如果n0,然後0
  • 如果n >>> 311,它被簽署,那麼是負面的,並會爲n egated到-1
  • 如果n >>> 310,它沒有簽署,那麼積極,並且默認將1
+0

注意這裏假定'n'是Int32,不是Long,並且對於負的'n < - (2 ** 31 + 1)'將會失敗。 –

+1

@PaulS .:是的,在我的答案中註明了範圍限制。 :) –

+0

我沒有把這個標記爲正確的,因爲它對大多數人來說並不是超級直覺,但是它很短。我非常喜歡這種方式,並感謝您發佈它! – BishopZ

相關問題