¿Número positivo a número negativo en JavaScript?


101

Básicamente, lo contrario de los abdominales. Si tengo:

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

No importa qué consola siempre devuelve un número positivo. ¿Cómo puedo solucionar esto?

Si lo hago:

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

aunque funciona, pero no es "DRY" y es estúpido tener un bloque completo de código SOLO para un -.


4
Estoy seguro de que hay un complemento de jQuery para eso.
Jakub Hampl

Respuestas:


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

Sin embargo, se da cuenta de que para su código

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

Si el índice encontrado es 3 y slideNum es 3,
entonces 3 <3-1 => falso
entonces slideNum sigue siendo positivo ??

A mí me parece más un error lógico.



29

La fórmula básica para invertir de positivo a negativo o de negativo a positivo:

i - (i * 2)

32
¿Qué pasa con i * -1? Además, no estoy seguro de que esto responda a la pregunta real.
Andrew Barber

5
Es arquitectónicamente dependiente, pero 0 - podría ser más rápido
Ben Taliadoros

@AndrewBarber i * -1no parece funcionar en la versión actual de Chrome. Use -Math.abs (1) aunque no estoy seguro de por qué funciona, con suerte alguien puede ampliar el por qué.
Philip Rollins

@PhilipRollins i * -1funcionará, siempre. No sé cómo lo intentaste, tal vez tuviste algún error tipográfico. Pero ... ¿qué tiene de malo en i = -ilugar de i = i * -1(o i *= -1) revertir de positivo a negativo o de negativo a positivo?
Diego ZoracKy

@DiegoZoracKy Yo también lo pensé, pero no para la versión de Chrome que estaba ejecutando y funcionó en Firefox, por lo que un error tipográfico está fuera de discusión. Estoy en Linux en este momento, pero puedes probar tu teoría en Chrome. Tenga en cuenta las actualizaciones automáticas de Chrome, por lo que las correcciones de errores ya se aplicarían y los nuevos errores se enviarían a la comunidad, lo que significa que podría haber sido un error que solo duró unos días y ahora se ha solucionado para siempre.
Philip Rollins

9

Para obtener una versión negativa de un número en JavaScript, siempre puede usar el ~operador bit a bit.

Por ejemplo, si lo ha hecho a = 1000y necesita convertirlo en negativo, puede hacer lo siguiente:

a = ~a + 1;

Lo que resultaría en aser -1000.


¿Es esto más rápido que multiplicar por 1 negativo?
Ryandawkins

No estoy seguro de ser honesto, algo que tendrías que investigar.
Benjamin Williams

@RyanDawkins esto no será más rápido que multiplicar por -1. Javascript no tiene operadores booleanos de forma nativa como lo hace C. Entonces, para hacer una operación booleana, JS tiene que convertir entre tipos bajo el capó.
spinlock

2
¿Por qué no a = -a?
Diego ZoracKy

Bitwise no niega un número exactamente. ~1000es -1001, no -1000.
brentonstrine

7
var x = 100;
var negX = ( -x ); // => -100

1
Agregue algunas explicaciones editando su respuesta, evite la respuesta de solo código
GGO

1
@GGO ... No estoy seguro de cómo esto aún no está claro, pero seguro: al agregar el signo menos delante del valor, luego envolverlo entre paréntesis, el valor se evalúa ... el resultado es la Negación del valor.
tpayne84

6

¿Estás seguro de que el control entra en el cuerpo del if? ¿Como en la condición en el ifsiempre es cierto? Porque si no es así, el cuerpo del ifnunca se ejecutará y slideNumseguirá siendo positivo. Voy a arriesgarme a adivinar que probablemente esto es lo que estás viendo.

Si intento lo siguiente en Firebug, parece que funciona:

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

slideNum *= -1también debería funcionar. Como debería Math.abs(slideNum) * -1.


Acabo de hacerlo if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 }y todavía estoy dando positivo en ese console.log?
Oscar Godson

@Oscar, lo que dice Vivin es que $this.find('.pdxslide-activeSlide').index() < slideNum-1siempre es falso.
David Tang

4

Si no tiene ganas de usar Math.Abs ​​* -1, puede usar esta simple declaración if: P

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

Por supuesto, podrías hacer de esto una función como esta

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

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

¡Espero que esto ayude! Es probable que Math.abs funcione para usted, pero si no es así, este pequeño


Antes de responder una pregunta, también debe considerar cuándo se hizo. Esta pregunta tiene casi 5 años. Entonces, a menos que la tecnología haya cambiado y ahora haya una respuesta mejor / más apropiada, generalmente no hay mucho valor agregado al ofrecer otra respuesta.
Igor

1
Personalmente, reviso las viejas preguntas de desbordamiento de pila todo el tiempo. Seguro que esto no será muy útil para un profesional, ¡pero quizás un principiante podría apreciar el consejo! Dicho esto, la forma más fácil realmente es la anterior -Math.Abs ​​(-3) Como se discutió anteriormente Math.Abs ​​convierte cualquier valor en positivo. Luego, el prefijo negativo lo convierte en negativo
Ash Pettit

Voto a favor. Personalmente aprecio esta respuesta y la encontré valiosa. Puedes aprender de cualquiera.
jeremysawesome

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

Resultado: -10

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

Resultado: 10

Si divide por menos 1, siempre cambiará su número de cualquier manera.



2

Javascript tiene un operador dedicado para esto: negación unaria .

TL; DR: ¡Es el signo menos!

Para negar un número, simplemente antepóngalo -de la manera más intuitiva posible. No es necesario escribir una función, use Math.abs()multiplicar por -1o use el operador bit a bit.

La negación unaria funciona en literales numéricos:

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

También funciona con variables:

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

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

Incluso puede usarlo varias veces si usa el operador de agrupación (también conocido como paréntesis:

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)

Todo lo anterior también funciona con una variable.



1

Convertirá una matriz negativa en positiva o viceversa.

function negateOrPositive(arr) {
    arr.map(res => -res)
};

0

En javascript vainilla

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

Donde el número de arriba es el número positivo que pretende convertir

Este código convertirá solo números positivos en números negativos simplemente multiplicando por -1

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.