Converter um número negativo em positivo em JavaScript

308

Existe uma função matemática no JavaScript que converte números em valor positivo?

Dave
fonte

Respostas:

704

Você poderia usar isso ...

Math.abs(x)

Math​.abs()| MDN

ChrisNel52
fonte
1
Você pode até considerar ~ x + 1. É bem rápido, mas não está claro o que está fazendo. Clique aqui para mostrar a diferença: jsperf.com/absolute-int
omgaz
22
@omgaz Eles não são os mesmos ... var x = -100; ~x+1 === 100mas var x = 100; ~x+1 === -100. Math.abssempre o torna positivo, enquanto o complemento simplesmente inverte o sinal.
Jduncanator
Você pode até considerar -x. É bem rápido!
amara
93

Que tal x *= -1? Eu gosto da sua simplicidade.

gnclmorais
fonte
17
Embora isso seja simples, assume-se que o número sempre será negativo. Se o caso de uso for esse, é incrível. Caso contrário, aconselho cautela.
11135 myusuf
4
Eu discordo @myusuf. Qualquer número que seja xserá invertido. Se x = 23e for inserido nessa equação, xserá igual -23. Nas palavras do Sr. Escalante, "Um positivo vezes que um negativo é igual a um negativo. Um negativo vezes que um negativo é igual a um positivo". ... "Como eu alcanço esses kiiiiiiids ?!"
ExcellentSP
2
Exatamente @ Shane ontem. Se x=23, então se tornará -23. Conforme a pergunta, 'Converta um número negativo para um número positivo em JS', mas o acima irá inverter qualquer número, seja ele positivo ou negativo.
myusuf 14/08/2015
2
Entendido. Minha interpretação do seu comentário foi no contexto de inverter o número e nem xsempre ser positiva. Minhas desculpas @myusuf.
ExcellentSP
1
apenas lembrar que esta solução não se aplica para os números float, só fica a parte decimal
Oscar Luza
46

Math.abs(x)ou se você está certo o valor é negativo antes da conversão apenas prefixar um sinal de menos regulares: x = -x.

orlp
fonte
29

O sinal de menos (-) pode converter números positivos em números negativos e números negativos em números positivos. x=-yé açúcar visual para x=(y*-1).

var y = -100;
var x =- y;
Rodovia da Vida
fonte
15
unsigned_value = Math.abs(signed_value);
Marc B
fonte
12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

Acho esta solução fácil de entender.

MarkD
fonte
8

Se você gostaria de escrever um código interessante que ninguém mais possa atualizar, tente o seguinte:

~ --x

Kyle
fonte
1
Isso não funciona com pontos flutuantes ... e o valor de x também muda.
Alexis Wilke
Eu acho que se você não pode mudar x: ~ --x; ++ x
Kyle
1
Kyle, o ~operador converte o número em um número inteiro de 32 bits. Se você tiver um flutuador como entrada, ele será mangueira.
Alexis Wilke
7

Eu sei que isso é um pouco tarde, mas para as pessoas que lutam com isso, você pode usar as seguintes funções:

  • Torne qualquer número positivo

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
  • Torne qualquer número negativo

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
  • Inverter qualquer número

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54
Adeel Imran
fonte
6

Negativo para positivo

var X = -10 ;
var number = Math.abs(X);     //result 10

Positivo para negativo

var X = 10 ;
var number = (X)*(-1);       //result -10
Bashirpour
fonte
Eu vejo o que você quer mostrar, mas o jeito que você coloca é confuso. Talvez você deva declarar: positivo: use abs; negativo: abs (x) * -1. Dessa forma, você não implica qual é o ex-sinal X.
Dionys 17/04
5

Multiplicar por (-1) é a maneira mais rápida de converter números negativos em positivos. Mas você deve ter cuidado para não converter meu erro em um número positivo em negativo! Portanto, é necessária uma verificação adicional ...

Então Math.abs, Math.floor e parseInt são os mais lentos.

insira a descrição da imagem aqui

https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1

Combinar
fonte
1
Alguns de nós esquecemos o quão útil a matemática básica pode ser nesses casos. Obrigado por me lembrar de tanta simplicidade.
Alexander Dixon
2

Eu fiz algo assim sozinho.

num<0?num*=-1:'';

Ele verifica se o número é negativo e, se for, multiplique por -1. Isso retorna um valor, depende de você se você o capturar. Caso você queira atribuí-lo a algo, você provavelmente deve fazer algo como:

var out = num<0?num*=-1:num; //I think someone already mentioned this variant.

Mas isso realmente depende do seu objetivo. Para mim, era simples, faça positivo se negativo, caso contrário não faça nada. Daí o '' no código. Neste caso, usei o operador terciário, porque eu queria, poderia muito bem ser:

if(num<0)num*=-1;

Eu vi a solução bit a bit aqui e queria comentar sobre essa também.

~--num; //Drawback for this is that num original value will be reduced by 1

Este soultion é muito chique na minha opinião, poderíamos reescrevê-lo assim:

~(num = num-1);

Em termos simples, pegamos o número negativo, tiramos um número e depois o invertemos bit a bit. Se o tivéssemos invertido normalmente, teríamos um valor 1 muito pequeno. Você também pode fazer isso:

~num+1; //Wont change the actual num value, merely returns the new value

Isso fará o mesmo, mas inverterá primeiro e depois adicionará 1 ao número positivo. Embora você não possa fazer isso:

~num++; //Wont display the right value.

Isso não funcionará por causa da precedência , operadores de postfix como num++seriam avaliados antes de ~ e o prefixo do motivo ++numnão funcionaria, mesmo que esteja na mesma precedência que NOT (~) bit a bit, porque é avaliado da direita para a esquerda. Eu tentei trocá-los, mas parece que o prefixo é um pouco exigente em comparação com o NOT bit a bit. O +1 funcionará porque '+' tem uma precedência mais alta e será avaliado posteriormente.

Achei a solução bastante divertida e decidi expandi-la, pois era lançada lá e postar pessoas que a observavam provavelmente a estavam ignorando. Embora sim, ele não funciona com carros alegóricos.

Minha esperança é que este post não se afaste da pergunta original. : /

Atspulgs
fonte
2

Minha abordagem mínima

Para converter número negativo em positivo e vice-versa

var num = -24;
num -= num*2;
console.log(num)
// result = 24

Mabweh Isaac
fonte
0

Você pode usar o operador ~ que converte logicamente o número em negativo e adiciona 1 ao negativo:

var x = 3;
x = (~x + 1);
console.log(x)
// result = -3

Mr.X
fonte
0

Eu conheço outra maneira de fazer isso. Esta técnica funciona de negativo para positivo e vice-versa

var x = -24;
var result = x * -1;

Vice-versa:

var x = 58;
var result = x * -1;

CÓDIGO AO VIVO:

// NEGATIVE TO POSITIVE: ******************************************
var x = -24;
var result = x * -1;
console.log(result);

// VICE VERSA: ****************************************************
var x = 58;
var result = x * -1;
console.log(result);

// FLOATING POINTS: ***********************************************
var x = 42.8;
var result = x * -1;
console.log(result);

// FLOATING POINTS VICE VERSA: ************************************
var x = -76.8;
var result = x * -1;
console.log(result);

Tarryk Ttmm
fonte
Isso não responde à pergunta. dave solicita uma função que altera o valor negativo para positivo e positivo para positivo .
RaphaMex
Sua pergunta diz: "Existe uma função matemática no JavaScript que converte números em valor positivo?" Ele não menciona positivo para positivo. Ele apenas menciona negativo para positivo. Por que você deseja converter positivo em positivo? O valor seria o mesmo.
Tarryk Ttmm
Você pode pedir esclarecimentos em um comentário abaixo da pergunta. De qualquer forma, há uma resposta aceita que é a correta. Você pode lê-lo novamente e ver que há uma função interna que ... converte positivo em positivo.
RaphaMex 01/02
0

Para uma programação funcional, o Ramda possui um ótimo método para isso. O mesmo método funciona passando de positivo para negativo e vice-versa.

https://ramdajs.com/docs/#negate

racêmico
fonte
0

Se você deseja que o número seja sempre positivo, não importa o que você possa fazer.

function toPositive(n){
    if(n < 0){
        n = n * -1;
    }
    return n;
}
var a = toPositive(2);  // 2
var b = toPositive(-2); // 2

Você também pode tentar isso, mas eu não recomendo:

function makePositive(n){
    return Number((n*-n).toString().replace('-','')); 
}
var a = makePositive(2);  // 2
var b = makePositive(-2); // 2

O problema disso é que você pode alterar o número para negativo, converter para string e remover o - da string e, em seguida, converter novamente para int. O que eu acho que levaria mais processamento do que apenas usar a outra função.

Eu testei isso em php e a primeira função é mais rápida, mas às vezes JS faz algumas coisas loucas, então não posso dizer com certeza.

Dillon Burnett
fonte
O segundo exemplo gera a potência do número de entrada. n*-ndeveria ser n*-1. Eu removeria o exemplo por completo, já que as conversões de tipo e chamada de método são muito ineficientes em comparação com a simplicidade do primeiro exemplo. Até a peculiaridade de JS não pode ajudar aqui
Gust van de Wal