Número positivo para número negativo em JavaScript?

101

Basicamente, o reverso do abdômen. Se eu tiver:

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

Não importa qual console sempre retorna um número positivo. Como faço para corrigir isso?

Se eu fizer:

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

funciona embora, mas não é "SECO" e apenas estúpido ter um bloco inteiro de código APENAS para um -.

Oscar Godson
fonte
4
Tenho certeza de que há um plugin jQuery para isso.
Jakub Hampl

Respostas:

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

Você percebe, no entanto, que para o seu código

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

Se o índice encontrado for 3 e slideNum for 3,
então 3 <3-1 => falso,
então slideNum permanecerá positivo ??

Parece mais um erro lógico para mim.

RichardTheKiwi
fonte
83

O reverso do abs é Math.abs(num) * -1.

Jakub Hampl
fonte
10
Shorter:return -Math.abs(num);
sarunast de
29

A fórmula básica para reverter positivo para negativo ou negativo para positivo:

i - (i * 2)
Blake
fonte
32
O que há de errado i * -1? Além disso, não tenho certeza se isso responde à pergunta real.
Andrew Barber,
5
É dependente da arquitetura, mas 0 - posso ser mais rápido
Ben Taliadoros
@AndrewBarber i * -1não parece funcionar na versão atual do Chrome. Use -Math.abs (1), mas não sei por que isso funciona, espero que alguém possa expandir o porquê.
Philip Rollins
@PhilipRollins i * -1funcionará, sempre. Não sei como você tentou, talvez você tenha cometido algum erro de digitação. Mas ... o que há de errado em i = -ivez de i = i * -1(ou i *= -1) reverter o positivo para o negativo ou o negativo para o positivo?
Diego ZoracKy
@DiegoZoracKy Eu também pensei, mas não para a versão do chrome que eu estava executando e funcionava no firefox, então um erro de digitação está fora de questão. Estou no Linux agora, mas você está livre para testar sua teoria sobre o Chrome. Lembre-se de atualizações automáticas do Chrome para que qualquer correção de bug já seja aplicada e qualquer novo bug seja enviado para a comunidade, o que significa que pode ter sido um bug que durou apenas alguns dias e agora está corrigido para sempre.
Philip Rollins
9

Para obter uma versão negativa de um número em JavaScript, você sempre pode usar o ~operador bit a bit.

Por exemplo, se você tem a = 1000e precisa convertê-lo em negativo, pode fazer o seguinte:

a = ~a + 1;

O que resultaria em aser -1000.

Benjamin Williams
fonte
Isso é mais rápido do que multiplicar por 1 negativo?
ryandawkins
Não tenho certeza para ser honesto, algo que você teria que investigar.
Benjamin Williams
@RyanDawkins isso não será mais rápido do que multiplicar por -1. Javascript não possui operadores booleanos nativamente como o C. Portanto, para fazer uma operação booleana, JS precisa converter entre os tipos por baixo do capô.
spinlock de
2
Porque não a = -a?
Diego ZoracKy
O bit a bit não nega um número exatamente. ~1000é -1001, não -1000.
brentonstrina
7
var x = 100;
var negX = ( -x ); // => -100
tpayne84
fonte
1
Por favor, adicione algumas explicações editando sua resposta, evite responder apenas código
GGO
1
@GGO ... Não tenho certeza de como isso ainda não está claro, mas certo: Ao adicionar o sinal de menos na frente do valor, em seguida, colocando-o entre parênteses, o valor é avaliado ... o resultado é a Negação do valor.
tpayne84
6

Tem certeza de que o controle está indo para o corpo do if? Como em que a condição em ifsempre é verdadeira? Porque do contrário, o corpo do ifnunca será executado e slideNumpermanecerá positivo. Vou arriscar um palpite de que provavelmente é isso que você está vendo.

Se eu tentar o seguinte no Firebug, parece funcionar:

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

slideNum *= -1também deve funcionar. Como deveria Math.abs(slideNum) * -1.

Vivin Paliath
fonte
Acabei de fazer if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }e ainda estou retornando positivo naquele console.log?
Oscar Godson,
@Oscar, o que Vivin está falando é que $this.find('.pdxslide-activeSlide').index() < slideNum-1sempre é falso.
David Tang,
4

Se você não quiser usar Math.Abs ​​* -1, você pode usar esta instrução if simples: P

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

Claro que você poderia fazer uma função assim

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

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

Espero que isto ajude! Math.abs provavelmente funcionará para você, mas se não funcionar, pouco

Ash Pettit
fonte
Antes de responder a uma pergunta, você também deve considerar quando ela foi feita. Esta pergunta tem quase 5 anos. Portanto, a menos que a tecnologia tenha mudado e agora haja uma resposta melhor / mais apropriada, geralmente não há muito valor agregado em oferecer outra resposta.
Igor
1
Eu, pessoalmente, examino as velhas questões de estouro de pilha o tempo todo. Claro que isso não será muito útil para um profissional, mas talvez um iniciante possa apreciar a dica! Dito isso, a maneira mais fácil realmente é como acima -Math.Abs ​​(-3) Como discutido acima, Math.Abs ​​torna qualquer valor positivo. Então, o prefixo negativo torna negativo
Ash Pettit,
Votado. Pessoalmente, agradeço esta resposta e achei-a valiosa. Você pode aprender com qualquer pessoa.
jeremysawesome
3
var i = 10;
i = i / -1;

Resultado: -10

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

Resultado: 10

Se você dividir por 1 negativo, sempre inverterá seu número de qualquer maneira.

Jeff Price
fonte
2
num * -1

Isso faria isso por você.

Vibhor Dube
fonte
2

Javascript tem um operador dedicado para isso: negação unária .

TL; DR: É o sinal de menos!

Para negar um número, basta prefixá-lo -da maneira mais intuitiva possível. Não há necessidade de escrever uma função, use Math.abs()multiplicar por-1 ou use o operador bit a bit.

A negação unária funciona em literais de número:

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

Também funciona com variáveis:

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

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

Você pode até mesmo usá-lo várias vezes se usar o operador de agrupamento (também conhecido como parênteses:

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)

Todos os itens acima também funcionam com uma variável.

brentonstrina
fonte
1

Use 0 - x

x sendo o número que você deseja inverter

milesman 34
fonte
3
apenas -xsuficiente.
Antti Haapala
1
Apenas -x resulta em -0. Esta solução é melhor se houver zeros-
chrismarx
1

Ele irá converter a matriz negativa em positiva ou vice-versa

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

Em javascript vanilla

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

Onde o número acima é o número positivo que você pretende converter

Este código converterá apenas números positivos em números negativos, simplesmente multiplicando por -1

perfo
fonte