2009-11-09 11 views

Respuesta

11
if (myvar < 0) { 
    myvar = -myvar; 
} 

o

myvar = Math.abs(myvar); 
+0

Así que hacer -myvar a un valor como -900 lo hace negativo de -900 o 900? – ian

+0

Un negativo negativo es positivo. Entonces - (- 900) == 900. –

+1

Sí, ya que dos negativos dan positivo. Yo usaría Math.abs() aunque –

46

utiliza el método Math.abs.

Hay un comentario más abajo sobre el uso de la negación (gracias Kelly por hacerme pensar en eso), y es ligeramente más rápido frente a la Math.abs sobre una gran cantidad de conversiones si se hace una referencia local a la función Math.abs (sin el la referencia local Math.abs es mucho más lenta).

Mira el answer to this question para más detalles. En números pequeños, la diferencia es insignificante, y creo que Math.abs es una forma mucho más limpia de "autoeditar" el código.

+1

Use la negación en su lugar. No se necesita una llamada de función. http://stackoverflow.com/questions/1701822/making-a-variable-value-positive/1702175#1702175 –

+0

Tengo que estar de acuerdo con @Kevin aquí. mientras "a = -a;" es explícito, todavía desencadena la fobia matemática en algunas personas, que incluye a los desarrolladores. Math.abs() parece decir lo mismo pero usa una parte diferente del cerebro. No comentaría Math.abs() pero podría decir "a = -a". –

+4

Esto es antiguo, pero me gustaría señalar la razón por la que usaría abs sobre simplemente negar el variabel si no sabía si era positivo o negativo y no quería usar una declaración if para verificar. –

1

Esto no es una aplicación de jQuery, pero utiliza la biblioteca de matemáticas de Javascript

x = Math.abs (x);

+4

¡Bravo! No todas las soluciones necesitan usar jQuery. Gran biblioteca pero usada. – MikeHall

2

o, si se quiere evitar llamada de función (y la ramificación), puede utilizar este código:

x = (x^(x >> 31)) - (x >> 31); 

es un poco "hacker" y se ve bien de alguna manera extraña :) pero me gustaría seguir con Math.abs (solo quería mostrar una forma más de hacerlo)

Por cierto, esto funciona solo si el motor de JavaScript subyacente almacena enteros como 32 bits, que es el caso en Firefox 3.5 en mi máquina (que es de 32 bits, por lo que podría no funcionar en la máquina de 64 bits, no ha probado ...)

+1

Claro, es de otra manera. Pero no está claro lo que haces, menos legible que Math.abs y si eso no es suficiente, también es más lento que Math.abs (x) en Firefox 3.6. Si debe complicar las cosas, use 'x <0? -x: x' (el más rápido en los otros navegadores probados). Tu código es un 1% más lento en Opera 10.63, un 12% más lento en Chrome 6.0 y un 20% más lento en IE8. – some

15

Entre estas dos opciones (gracias a @Kooilnc para el ejemplo):

Number.prototype.abs = function(){ 
    return Math.abs(this); 
}; 

y

var negative = -23, 
    positive = -negative>0 ? -negative : negative; 

van con el segundo (negación). No requiere una llamada de función y la CPU puede hacerlo en muy pocas instrucciones. Rápido, fácil y eficiente.

+0

Las matemáticas están muy optimizadas por el motor JS, no creo que sea más lento que la segunda opción. –

+0

Me pregunto cómo el compilador optimiza la llamada Math.abs(), ¿a quién le importa mirar y compartir con nosotros? –

+1

Confirmó que 'Math.abs' es casi 10 veces más rápido en Chrome: https://jsperf.com/ternary-vs-math-abs –

0

Si usted no se siente como el uso de Math.Abs ​​puede que esta simple instrucción if: P

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

Por supuesto que podría hacer de esto una función como esta

function makePositive(number) { 
    if (number < 0) { 
     number = -number; 
    } 
} 

makepositive (-3) => 3 makepositive (5) => 5

Espero que esto ayude! Math.abs es probable que funcione para usted, pero si no es así,

Cuestiones relacionadas