Da numero positivo a numero negativo in JavaScript?


101

Fondamentalmente, il contrario di addominali. Se ho:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  slideNum = -slideNum
}
console.log(slideNum)

Non importa quale console restituisce sempre un numero positivo. Come lo risolvo?

Se lo faccio:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  _selector.animate({
    left: (-slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
} else {
  _selector.animate({
    left: (slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
}

funziona comunque, ma non è "A SECCO" ed è semplicemente stupido avere un intero blocco di codice SOLO per un file -.


4
Sono sicuro che ci sia un plugin jQuery per questo.
Jakub Hampl

Risposte:


191
Math.abs(num) => Always positive
-Math.abs(num) => Always negative

Tuttavia, ti rendi conto che per il tuo codice

if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum = -slideNum }
console.log(slideNum)

Se l'indice trovato è 3 e slideNum è 3,
allora 3 <3-1 => false
quindi slideNum rimane positivo ??

A me sembra più un errore logico.



29

La formula di base per invertire il positivo in negativo o il negativo in positivo:

i - (i * 2)

32
Cosa c'è che non va i * -1? Inoltre, non sono sicuro che questo risponda alla domanda reale.
Andrew Barber,

5
Dipende dall'architettura, ma 0 - potrei essere più veloce
Ben Taliadoros

@AndrewBarber i * -1non sembra funzionare nella versione corrente di Chrome. Usa -Math.abs (1) non sei sicuro del motivo per cui funziona, spero che qualcuno possa espandere il perché.
Philip Rollins

@PhilipRollins i * -1funzionerà, sempre. non so come hai provato, forse hai avuto qualche errore di battitura. Ma ... cosa c'è di sbagliato i = -iinvece di i = i * -1(o i *= -1) invertire positivo in negativo o negativo in positivo?
Diego ZoracKy

@DiegoZoracKy Lo pensavo anch'io, ma non per la versione di Chrome che stavo utilizzando e funzionava in Firefox, quindi un errore di battitura è fuori discussione. Sono su Linux in questo momento, ma sei libero di testare la tua teoria su Chrome. Tieni presente gli aggiornamenti automatici di Chrome in modo che eventuali correzioni di bug sarebbero già state applicate e tutti i nuovi bug sarebbero stati inviati alla comunità, il che significa che questo potrebbe essere un bug che è durato solo pochi giorni e ora è risolto per sempre.
Philip Rollins

9

Per ottenere una versione negativa di un numero in JavaScript puoi sempre utilizzare l' ~operatore bit per bit.

Ad esempio, se hai a = 1000e devi convertirlo in negativo, potresti fare quanto segue:

a = ~a + 1;

Il che risulterebbe anell'essere -1000.


È più veloce che moltiplicare per 1 negativo?
ryandawkins

Non sono sicuro di essere onesto, qualcosa che dovresti esaminare.
Benjamin Williams

@ RyanDawkins questo non sarà più veloce della moltiplicazione per -1. Javascript non ha operatori booleani nativamente come fa il C. Quindi, per eseguire un'operazione booleana, JS deve convertire tra i tipi sotto il cofano.
spinlock

2
Perché no a = -a?
Diego ZoracKy

Bitwise non nega esattamente un numero. ~1000è -1001, non -1000.
brentonstrine

7
var x = 100;
var negX = ( -x ); // => -100

1
Si prega di aggiungere alcune spiegazioni modificando la risposta, evitare la risposta solo codice
GGO

1
@GGO ... non sono sicuro di come questo non sia già chiaro, ma certo: aggiungendo il segno meno davanti al valore, quindi racchiudendolo tra parentesi, il valore viene valutato ... il risultato è Negazione del valore.
tpayne84

6

Sei sicuro che il controllo stia entrando nel corpo di if? Come ifmai la condizione nel mondo è vera? Perché se non lo fa, il corpo del ifnon verrà mai eseguito e slideNumrimarrà positivo. Azzardo l'ipotesi che questo sia probabilmente quello che stai vedendo.

Se provo quanto segue in Firebug, sembra funzionare:

>>> i = 5; console.log(i); i = -i; console.log(i);
5
-5

slideNum *= -1dovrebbe funzionare anche. Come dovrebbe Math.abs(slideNum) * -1.


L'ho appena fatto if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }e sto ancora tornando positivo in quel console.log?
Oscar Godson

@Oscar, quello che sta dicendo Vivin è che $this.find('.pdxslide-activeSlide').index() < slideNum-1è sempre falso.
David Tang

4

Se non hai voglia di usare Math.Abs ​​* -1 puoi usare questa semplice istruzione if: P

if (x > 0) {
    x = -x;
}

Ovviamente potresti rendere questa una funzione come questa

function makeNegative(number) {
    if (number > 0) {
        number = -number;
    }
}

makeNegative (-3) => -3 makeNegative (5) => -5

Spero che questo ti aiuti! Math.abs probabilmente funzionerà per te, ma se non così poco


Prima di rispondere a una domanda, dovresti anche considerare quando è stata posta. Questa domanda ha quasi 5 anni. Quindi, a meno che la tecnologia non sia cambiata e ora ci sia una risposta migliore / più appropriata, di solito non c'è molto valore aggiunto offrendo un'altra risposta.
Igor

1
Personalmente guardo continuamente le vecchie domande di overflow dello stack. Sicuramente questo non sarà di grande aiuto per un professionista, ma forse un principiante potrebbe apprezzare il suggerimento! Detto questo, il modo più semplice è davvero come sopra -Math.Abs ​​(-3) Come discusso sopra Math.Abs ​​trasforma qualsiasi valore in positivo. Quindi il prefisso negativo lo rende negativo
Ash Pettit

Votato. Personalmente apprezzo questa risposta e l'ho trovata preziosa. Puoi imparare da chiunque.
jeremysawesome

3
var i = 10;
i = i / -1;

Risultato: -10

var i = -10;
i = i / -1;

Risultato: 10

Se dividi per 1 negativo, il numero verrà sempre capovolto in entrambi i casi.



2

Javascript ha un operatore dedicato per questo: negazione unaria .

TL; DR: È il segno meno!

Per negare un numero, è sufficiente anteporlo -nel modo più intuitivo possibile. Non è necessario scrivere una funzione, utilizzare Math.abs()moltiplicare per -1o utilizzare l'operatore bit per bit.

La negazione unaria funziona sui letterali numerici:

let a = 10;  // a is `10`
let b = -10; // b is `-10`

Funziona anche con le variabili:

let x = 50;
x = -x;      // x is now `-50`

let y = -6;
y = -y;      // y is now `6`

Puoi anche usarlo più volte se usi l'operatore di raggruppamento (noto anche come parentesi:

l = 10;       // l is `10`
m = -10;      // m is `-10`
n = -(10);    // n is `-10`
o = -(-(10)); // o is `10`
p = -(-10);   // p is `10` (double negative makes a positive)

Tutto quanto sopra funziona anche con una variabile.



1

Convertirà un array negativo in positivo o viceversa

function negateOrPositive(arr) {
    arr.map(res => -res)
};

0

In javascript vaniglia

if(number > 0)
  return -1*number;

Dove numero sopra è il numero positivo che intendi convertire

Questo codice convertirà solo i numeri positivi in ​​numeri negativi semplicemente moltiplicando per -1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.