Convierte un número negativo a uno positivo en JavaScript

308

¿Existe una función matemática en JavaScript que convierta los números a valor positivo?

Dave
fuente

Respuestas:

704

Podrías usar esto ...

Math.abs(x)

Math​.abs()El | MDN

ChrisNel52
fuente
1
Es posible que desee incluso considerar ~ x + 1. Es bastante rápido, pero no está claro qué está haciendo. Desarrollé esto para mostrar la diferencia: jsperf.com/absolute-int
omgaz
22
@omgaz No son lo mismo ... var x = -100; ~x+1 === 100pero var x = 100; ~x+1 === -100. Math.abssiempre lo hace positivo mientras toma el complemento unos, simplemente invierte el signo.
jduncanator
Es posible que desee considerar incluso -x. ¡Es bastante rápido!
amara
93

¿Qué hay de x *= -1? Me gusta su simplicidad.

gnclmorais
fuente
17
Si bien esto es simple, supone que el número siempre será negativo. Si el caso de uso es tal, entonces es increíble. De lo contrario, aconsejaría precaución.
myusuf
44
No estoy de acuerdo @myusuf. Cualquier número que sea xserá volteado. Si x = 23y se empuja en esa ecuación, xserá igual -23. En palabras del Sr. Escalante, "Un positivo por un negativo es igual a un negativo. Un negativo por un negativo es igual a un positivo". ... "¿Cómo llego a estos kiiiiiiids ?!"
ExcelenteSP
2
Exactamente @Shane ayer. Si x=23, entonces se convertirá en -23. Como dice la pregunta, 'Convierta un número negativo en un número positivo en JS', pero lo anterior cambiará cualquier número, ya sea positivo o negativo.
myusuf
2
Entendido. Mi interpretación de su comentario fue en el contexto de cambiar el número y no hacer que xsiempre sea positivo. Mis disculpas @myusuf.
ExcelenteSP
1
solo recuerde que esta solución no se aplica a los números Float, solo obtiene la parte decimal
Oscar Luza
46

Math.abs(x)o si no está determinado el valor es negativo antes de la conversión simplemente escriba un signo menos regulares: x = -x.

orlp
fuente
29

El signo menos (-) puede convertir números positivos en números negativos y números negativos en números positivos. x=-yes azúcar visual para x=(y*-1).

var y = -100;
var x =- y;
Carretera de la vida
fuente
15
unsigned_value = Math.abs(signed_value);
Marc B
fuente
12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

Encuentro esta solución fácil de entender.

MarkD
fuente
8

Si desea escribir un código interesante que nadie más pueda actualizar, intente esto:

~ --x

Kyle
fuente
1
Sin embargo, esto no funcionará con puntos flotantes ... y el valor de x también cambia.
Alexis Wilke
Supongo que si no puedes cambiar x: ~ --x; ++ x
Kyle
1
Kyle, el ~operador convierte el número a un entero de 32 bits. Si tiene un flotador como entrada, se manguera.
Alexis Wilke
7

Sé que esto es un poco tarde, pero para las personas que luchan con esto, pueden usar las siguientes funciones:

  • Convierte cualquier número positivo

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

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

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

Negativo a positivo

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

Positivo a negativo

var X = 10 ;
var number = (X)*(-1);       //result -10
Bashirpour
fuente
Veo lo que quieres mostrar, pero la forma en que lo expresas es confuso. Tal vez debería decir: a positivo: use abs, a negativo: abs (x) * -1. De esta manera no implica cuál es el antiguo signo X.
Dionys
5

Multiplicar por (-1) es la forma más rápida de convertir un número negativo en positivo. ¡Pero debes tener cuidado de no convertir mi error en un número positivo a negativo! Por lo tanto, se necesita un control adicional ...

Entonces Math.abs, Math.floor y parseInt es el más lento.

ingrese la descripción de la imagen aquí

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

Combinar
fuente
1
Algunos de nosotros olvidamos cuán útiles pueden ser las matemáticas básicas en tales casos. Gracias por recordarme esa simplicidad.
Alexander Dixon
2

Hice algo como esto yo mismo.

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

Comprueba si el número es negativo y si lo es, multiplícalo por -1. Esto devuelve un valor, depende de ti si lo capturas. En caso de que desee asignarlo a algo, probablemente debería hacer algo como:

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

Pero realmente depende de cuál es tu objetivo. Para mí fue simple, hacerlo positivo si es negativo, de lo contrario no hacer nada. De ahí el '' en el código. En este caso, utilicé el operador terciario porque quería, podría muy bien ser:

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

Vi la solución bit a bit aquí y quería comentar sobre eso también.

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

Esta idea es muy elegante en mi opinión, podríamos reescribirla así:

~(num = num-1);

En términos simples, tomamos el número negativo, le quitamos uno y luego lo invertimos bit a bit. Si lo hubiéramos invertido a nivel de bits, normalmente obtendríamos un valor 1 demasiado pequeño. También puedes hacer esto:

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

Eso hará lo mismo pero invertirá primero y luego sumará 1 al número positivo. Aunque NO PUEDES hacer esto:

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

Eso no funcionará por causa de precedencia , los operadores de postfix como num++se evaluarían antes de ~ y el prefijo de razón ++numno funcionaría aunque tenga la misma precedencia que NO a nivel de bit (~), es porque se evalúa de derecha a izquierda. Intenté intercambiarlos, pero parece que el prefijo es un poco complicado en comparación con NO a nivel de bits. El +1 funcionará porque '+' tiene una prioridad más alta y se evaluará más adelante.

Encontré que la solución era bastante divertida y decidí ampliarla, ya que se la arrojó allí y las personas que la miraron probablemente la ignoraron. Aunque sí, no funcionará con carrozas.

Espero que esta publicación no se haya alejado de la pregunta original. : /

Atspulgs
fuente
2

Mi enfoque minimo

Para convertir un número negativo a positivo y viceversa

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

Mabweh Isaac
fuente
0

Puede usar el operador ~ que convierte lógicamente el número a negativo y agrega 1 al negativo:

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

Sr. X
fuente
0

Sé otra forma de hacerlo. Esta técnica funciona de negativo a positivo y viceversa.

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

Viceversa:

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

CÓDIGO EN 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
fuente
Eso no responde la pregunta. Dave pide una función que cambie el valor negativo a positivo y positivo a positivo .
RaphaMex
Su pregunta dice: "¿Existe una función matemática en JavaScript que convierta los números en valores positivos?" No menciona positivo a positivo. Solo menciona negativo a positivo. ¿Por qué querrías convertir positivo a positivo? El valor sería el mismo.
Tarryk Ttmm
Puede solicitar una aclaración en un comentario debajo de la pregunta. De todos modos, hay una respuesta aceptada que es la correcta. Puede leerlo nuevamente y ver que hay una función incorporada que ... convierte positivo a positivo.
RaphaMex
0

Para una programación funcional, Ramda tiene un buen método para esto. El mismo método funciona yendo de positivo a negativo y viceversa.

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

racémico
fuente
0

Si desea que el número sea siempre positivo, no importa lo que pueda hacer.

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

También puedes probar esto, pero no lo recomiendo:

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

El problema con esto es que podría cambiar el número a negativo, luego convertirlo en una cadena y eliminar el - de la cadena, y luego volver a convertirlo en int. Lo cual supongo que requeriría más procesamiento que simplemente usar la otra función.

He probado esto en php y la primera función es más rápida, pero a veces JS hace algunas locuras, por lo que no puedo decir con certeza.

Dillon Burnett
fuente
El segundo ejemplo genera la potencia del número de entrada. n*-ndebería ser n*-1. Sin embargo, eliminaría el ejemplo por completo, ya que las conversiones de tipo y la llamada al método son muy ineficientes en comparación con la simplicidad del primer ejemplo. Incluso la peculiaridad de JS no puede ayudar aquí
Gust van de Wal