2012-11-19 26 views
8

Olası Çoğalt: Bazı sayı değişken göz önüne alındığında
Number.sign() in javascriptJavascript'te sadece bir sayının işaretini almanın en kolay yolu nedir?

, bu oturum oluyor belirlemek için en kolay yolu nedir?

böyle koduyla biten tutmak:

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

İstediğim tüm sayı 1 pozitifse, negatif ve 0 eğer -1 0 ise olduğunda, zarif az görünüyor

"En kolay" ile, gerçekten zarif veya daha az yazım demek istiyorum. Alternatif olarak, belki de kesinlikle bir değeri arttırmanın bir yolu vardır. Sayı negatifse, ondan 1 çıkartın ve bir tane eklemek için olumluysa. Math.abs() mutlak değeri sağlar, ancak Math.abs() 'ı çalıştırdıktan sonra imzalı bir numaraya dönüştürmenin bir yolu yoktur.

+0

için varsayılan olarak: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign Ancak uygulama nedeniyle talihsiz bir uç durumu vardır: 'Math.sign (-0) === Math.sign (+0) – johncip

cevap

14

Sadece yapabilirsiniz:

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

Hatalı indirimi reddetmek için yayınınıza bir kozmetik düzenleme yaptım. –

+0

Bu yaklaşım neredeyse her zaman kıyaslama temelli karşılaştırmalardan daha yavaştır, bölümün yavaş olması gerekir. –

2

Bunu mutlak tarafından sayısına bölebilirsiniz ve işaretini elde edersiniz:

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

Numara ne zaman 0? –

+0

@JamieWong Haklısınız. Benim kodumu –

+0

Wow güncellendi ve && 0 ilgilenir. Büyük cevaplar! – BishopZ

4

bir işlev tanımlama hakkında Nasıl yapılacak?

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

Bu, 'return n || ile aynı olmaz mıydı? n/Math.abs (n) '? – elclanrs

+0

Hatta onu Math'a maymun-yama yapabilir ve belki daha "sgn" veya "signum" olarak daha matematiksel olarak adlandırırsınız. –

+0

@elcanrs no, istediğiniz şeyin tam tersi - sadece n * * sıfır olduğunda bölümleme yapar. –

1

daha kısa bir yolunu istiyorsanız ve bu durumun bir numara olduğunu biliyorum ve bir imzalı 32 bitlik aralığı ile sınırlı sakıncası yoksa, bunu yapabilirsiniz:

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

  • n eğer o zaman, 0
  • n >>> 311 ise, o kadar negativ, imzalanan 0 ve n olacak -1
  • n >>> 310 ise hiç egated, bu `), yani pozitif imzalanmadığından ve ES6 ile` Math.sign (kullanabilirsiniz 1
+0

Not 'n' Int32, uzun değildir ve başarısız olur negatif 'n <- (2 ** 31 + 1)'. –

+1

@PaulS .: Evet, cevabımdaki aralık sınırlaması dikkat çekti. :) –

+0

Bunu doğru olarak işaretlemedim, çünkü çoğu insan için süper sezgisel değil, ama kısa. Bu yaklaşımı gerçekten çok beğendim ve gönderdiğiniz için teşekkür ederim! – BishopZ

İlgili konular