2012-11-19 9 views
8

Mögliche Duplizieren:
Number.sign() in javascriptWas ist der einfachste Weg in Javascript, um nur das Vorzeichen einer Zahl zu erhalten?

einige Zahlvariable gegeben, was ist der einfachste Weg, es unterschreiben, um zu bestimmen?

Ich halte Endung wie dies mit dem Code oben:

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

Es weniger scheint als elegant, wenn alles, was ich will, ist eine -1, wenn die Zahl negativ ist, 1, wenn positive und eine 0, wenn es 0 ist .

Mit "einfachste" meine ich wirklich elegant oder weniger tippen.

Alternativ gibt es vielleicht eine Möglichkeit, einen Wert absolut zu erhöhen. Wenn die Zahl negativ ist, subtrahiere 1 davon, und wenn es positiv ist, addiere eins dazu. Math.abs() liefert den absoluten Wert, aber es gibt keine Möglichkeit, sie wieder in eine vorzeichenbehaftete Zahl umzuwandeln, sobald Sie Math.abs() ausführen.

+0

Mit ES6 Standard können Sie 'Math.sign verwenden()': https://developer.mozilla.org/de-DE/docs/Web/JavaScript/Referenz/Global_Objects/Math/sign Allerdings hat es aufgrund der Implementierung einen unglücklichen Randfall: 'Math.sign (-0) === Math.sign (+0) ' – johncip

Antwort

14

Sie können dies nur tun:

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

Ich habe eine kosmetische Änderung an Ihrem Post vorgenommen, um einen unberechtigten Downvote rückgängig zu machen. –

+0

Dieser Ansatz ist ziemlich immer langsamer als der Vergleich in Benchmarks, Division muss langsam sein. –

2

Sie können die Anzahl von seiner absoluten teilen und Sie werden das Zeichen erhalten:

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

Was ist, wenn die Nummer 0 ist? –

+0

@JamieWong du hast Recht. Mein Code aktualisiert –

+0

Wow, und die && kümmert sich um 0. Große Antworten! – BishopZ

4

Wie wäre es mit einer Funktion definiert, es zu tun?

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

Wäre es nicht dasselbe wie 'return n || n/Math.abs (n) '? – elclanrs

+0

Du könntest es sogar in Mathe stecken und es vielleicht "sgn" oder "signum" nennen, um mathematischer zu sein. –

+0

@elcanrs nein, das ist das Gegenteil von dem was du willst - es macht die Division nur wenn n * ist * Null. –

1

Wenn Sie einen kürzeren Weg wollen, und Sie wissen, dass es eine Zahl, und es Ihnen nichts ausmacht zu einem signierten 32-Bit-Bereich beschränkt zu sein, können Sie dies tun:

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

  • wenn n ist 0, dann 0
  • wenn n >>> 31 ist 1, es unterzeichnet wurde, so negativ und wird n egated zu -1
  • wenn n >>> 31 ist 0, wurde sie nicht unterzeichnet, so positiv und wird 1
+0

Hinweis: Dies setzt voraus, dass "n" Int32 ist, nicht Long und für negatives 'n <- (2 ** 31 + 1)'. –

+1

@PaulS .: Ja, bemerkte die Bereichsbegrenzung in meiner Antwort. :) –

+0

Ich habe dies nicht als das richtige markiert, weil es für die meisten Leute nicht super intuitiv ist, aber wow, es ist kurz. Ich mag diesen Ansatz wirklich und danke Ihnen für das Posten! – BishopZ

Verwandte Themen