Nombre positif à nombre négatif dans JavaScript?

101

Fondamentalement, l'inverse des abs. Si j'ai:

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

Quelle que soit la console, elle renvoie toujours un nombre positif. Comment puis-je réparer ça?

Si je fais:

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')
}

ça marche, mais ce n'est pas "DRY" et juste stupide d'avoir un bloc entier de code JUSTE pour un -.

Oscar Godson
la source
4
Je suis sûr qu'il existe un plugin jQuery pour cela.
Jakub Hampl

Réponses:

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

Vous réalisez cependant que pour votre code

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

Si l'index trouvé est 3 et slideNum est 3,
alors 3 <3-1 => false
donc slideNum reste positif ??

Cela ressemble plus à une erreur de logique pour moi.

RichardTheKiwi
la source
83

L'inverse des abdos est Math.abs(num) * -1.

Jakub Hampl
la source
10
Plus court:return -Math.abs(num);
sarunast
29

La formule de base pour inverser le positif en négatif ou le négatif en positif:

i - (i * 2)
Blake
la source
32
Quel est le problème avec i * -1? De plus, je ne suis pas sûr que cela réponde à la question réelle.
Andrew Barber
5
Cela dépend de l'architecture, mais 0 - je serais peut-être plus rapide
Ben Taliadoros
@AndrewBarber i * -1ne semble pas fonctionner dans la version actuelle de chrome. Utilisez -Math.abs (1) mais ne savez pas pourquoi cela fonctionne, espérons que quelqu'un pourra expliquer pourquoi.
Philip Rollins
@PhilipRollins i * -1fonctionnera toujours. Je ne sais pas comment vous avez essayé, peut-être avez-vous eu une faute de frappe. Mais ... qu'est-ce qui ne va pas au i = -ilieu de i = i * -1(ou i *= -1) inverser le positif au négatif ou le négatif au positif?
Diego ZoracKy
@DiegoZoracKy Je le pensais aussi, mais pas pour la version de chrome que j'utilisais et cela fonctionnait sous Firefox, donc une faute de frappe est hors de question. Je suis sous Linux en ce moment, mais vous êtes libre de tester votre théorie sur Chrome. Gardez à l'esprit les mises à jour automatiques de Chrome afin que toutes les corrections de bogues soient déjà appliquées et que tous les nouveaux bogues soient transmis à la communauté, ce qui signifie que cela pourrait être un bogue qui n'a duré que quelques jours et qui est maintenant corrigé pour toujours.
Philip Rollins
9

Pour obtenir une version négative d'un nombre en JavaScript, vous pouvez toujours utiliser l' ~opérateur au niveau du bit.

Par exemple, si vous avez a = 1000et que vous devez le convertir en négatif, vous pouvez effectuer les opérations suivantes:

a = ~a + 1;

Ce qui aboutirait à aêtre -1000.

Benjamin Williams
la source
Est-ce plus rapide que de multiplier par moins 1?
ryandawkins
Je ne suis pas sûr d'être honnête, quelque chose que vous devrez examiner.
Benjamin Williams le
@RyanDawkins ce ne sera pas plus rapide que de multiplier par -1. Javascript n'a pas d'opérateurs booléens nativement comme le fait C. Donc, pour faire une opération booléenne, JS doit convertir entre les types sous le capot.
spinlock
2
Pourquoi pas a = -a?
Diego ZoracKy
Bitwise n'annule pas exactement un nombre. ~1000est -1001, non -1000.
brentonstrine le
7
var x = 100;
var negX = ( -x ); // => -100
tpayne84
la source
1
Veuillez ajouter quelques explications en modifiant votre réponse, évitez la réponse code seulement
GGO
1
@GGO ... Je ne sais pas comment cela n'est pas déjà clair, mais sûr: en ajoutant le signe moins devant la valeur, puis en l'enveloppant entre parenthèses, la valeur est évaluée ... le résultat est Négation de la valeur.
tpayne84
6

Êtes-vous sûr que le contrôle entre dans le corps du if? Comme dans la condition dans le ifjamais est-elle vraie? Parce que si ce n'est pas le cas, le corps du ifne sera jamais exécuté et slideNumrestera positif. Je vais risquer de penser que c'est probablement ce que vous voyez.

Si j'essaye ce qui suit dans Firebug, cela semble fonctionner:

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

slideNum *= -1devrait également fonctionner. Comme il se doit Math.abs(slideNum) * -1.

Vivin Paliath
la source
Je viens de le faire if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }et je reviens toujours positif dans ce console.log?
Oscar Godson le
@Oscar, ce que dit Vivin, c'est que $this.find('.pdxslide-activeSlide').index() < slideNum-1c'est toujours faux.
David Tang
4

Si vous n'avez pas envie d'utiliser Math.Abs ​​* -1, vous pouvez utiliser cette instruction if simple: P

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

Bien sûr, vous pouvez en faire une fonction comme celle-ci

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

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

J'espère que cela t'aides! Math.abs fonctionnera probablement pour vous, mais si ce n'est pas si peu

Ash Pettit
la source
Avant de répondre à une question, vous devez également tenir compte du moment où elle a été posée. Cette question a presque 5 ans. Donc, à moins que la technologie n'ait changé et qu'il y ait maintenant une réponse meilleure / plus appropriée, il n'y a généralement pas beaucoup de valeur ajoutée en offrant une autre réponse.
Igor
1
Personnellement, je regarde constamment les anciennes questions de dépassement de pile. Bien sûr, cela ne sera pas très utile à un professionnel, mais peut-être qu'un débutant pourrait apprécier le conseil! Cela dit, le moyen le plus simple est vraiment comme ci-dessus -Math.Abs ​​(-3) Comme indiqué ci-dessus, Math.Abs ​​transforme toute valeur positive. Ensuite, le préfixe négatif le rend négatif
Ash Pettit
J'ai voté pour. Personnellement, j'apprécie cette réponse et je l'ai trouvée utile. Vous pouvez apprendre de n'importe qui.
jeremysawesome
3
var i = 10;
i = i / -1;

Résultat: -10

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

Résultat: 10

Si vous divisez par moins de 1, votre nombre sera toujours inversé dans un sens ou dans l'autre.

Jeff Price
la source
2
num * -1

Cela le ferait pour vous.

Vibhor Dube
la source
2

Javascript a un opérateur dédié pour cela: la négation unaire .

TL; DR: C'est le signe moins!

Pour annuler un nombre, préfixez-le simplement -de la manière la plus intuitive possible. Pas besoin d'écrire une fonction, utiliser Math.abs()multiplier par -1ou utiliser l'opérateur au niveau du bit.

La négation unaire fonctionne sur les littéraux numériques:

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

Cela fonctionne aussi avec des variables:

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

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

Vous pouvez même l'utiliser plusieurs fois si vous utilisez l'opérateur de regroupement (aka parenthèses:

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)

Tout ce qui précède fonctionne également avec une variable.

brentonstrine
la source
1

Utiliser 0 - x

x étant le nombre que vous souhaitez inverser

milesman34
la source
3
-xsuffit juste .
Antti Haapala
1
Juste -x donne -0. Cette solution est meilleure s'il peut y avoir des zéros-
chrismarx
1

Il convertira un tableau négatif en positif ou vice versa

function negateOrPositive(arr) {
    arr.map(res => -res)
};
Flash Noob
la source
0

En javascript vanille

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

Où le nombre ci-dessus est le nombre positif que vous avez l'intention de convertir

Ce code convertira uniquement les nombres positifs en nombres négatifs simples en multipliant par -1

perfo
la source