Respostas:
var x = -100; ~x+1 === 100
mas var x = 100; ~x+1 === -100
. Math.abs
sempre o torna positivo, enquanto o complemento simplesmente inverte o sinal.
Que tal x *= -1
? Eu gosto da sua simplicidade.
x
será invertido. Se x = 23
e for inserido nessa equação, x
será 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 ?!"
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.
x
sempre ser positiva. Minhas desculpas @myusuf.
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;
Se você gostaria de escrever um código interessante que ninguém mais possa atualizar, tente o seguinte:
~ --x
~
operador converte o número em um número inteiro de 32 bits. Se você tiver um flutuador como entrada, ele será mangueira.
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
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
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.
https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1
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 ++num
nã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. : /
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
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
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);
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.
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.
n*-n
deveria 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