2012-11-19 17 views
8

Eventuali duplicati:
Number.sign() in javascriptQual è il modo più semplice in Javascript per ottenere solo il segno di un numero?

Dato un numero variabile, qual è il modo più semplice per determinare che è segno?

continuo a finire con codice come questo:

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

Sembra meno elegante, quando tutto quello che voglio è un -1 se il numero è negativo, 1 se positivo e 0 se è 0

Per "più semplice" intendo davvero elegante o meno digitante.

In alternativa, forse c'è un modo per aumentare assolutamente un valore. Come se il numero fosse negativo, quindi sottrarre 1 da esso e se è positivo aggiungerne uno. Math.abs() fornisce il valore assoluto, ma non è possibile convertirlo in un numero firmato dopo aver eseguito Math.abs().

+0

Con ES6 è possibile usare 'Math.sign()': https://developer.mozilla.org/it/it/Documenti/Web/JavaScript/Riferimento/Global_Objects/Math/sign Tuttavia a causa dell'implementazione ha uno sfortunato caso limite: 'Math.sign (-0) === Math.sign (+0) ' – johncip

risposta

14

Si potrebbe semplicemente fare questo:

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

Ho apportato una modifica cosmetica al tuo post per poter eseguire il rollback ingiustificato. –

+0

Questo approccio è praticamente sempre più lento di quello basato sui confronti nei benchmark, la divisione deve essere dardamente lenta. –

2

È possibile dividere il numero per la sua assoluta e si otterrà il segno:

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

Che dire quando il numero è 0? –

+0

@JamieWong hai ragione. Aggiornato il mio codice –

+0

Wow, e il && si prende cura di 0. Grandi risposte! – BishopZ

4

Come sulla definizione di una funzione per farlo?

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

Non sarebbe lo stesso di 'return n || n/Math.abs (n) '? – elclanrs

+0

Si potrebbe persino usare la patch della scimmia in Math, e forse chiamarla 'sgn' o' signum' per essere più matematici. –

+0

@elcanrs no, questo è l'opposto di quello che vuoi: fa la divisione solo quando n * è * zero. –

1

Se vuoi un modo più breve, e sai che è un numero, e non ti dispiace essere limitato a una gamma a 32 bit con segno, si può fare questo:

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

  • se n è 0, quindi 0
  • se n >>> 31 è 1, è stato firmato, in modo negativ, e sarà n egated a -1
  • se n >>> 31 è 0, esso non è stato firmato, in modo positivo e imposterà 1
+0

Nota Questo presuppone che 'n' sia Int32, non Long e fallirà per negativo' n <- (2 ** 31 + 1) '. –

+1

@PaulS .: Sì, ho notato la limitazione della gamma nella mia risposta. :) –

+0

Non l'ho contrassegnato come corretto perché non è molto intuitivo per la maggior parte delle persone, ma wow è breve. Mi piace molto questo approccio e ti ringrazio per averlo pubblicato! – BishopZ

Problemi correlati