Usando bit a bit OR 0 para establecer un número
Un colega mío se topó con un método para establecer números flotantes usando bit a bit o:
var a = 13.6 | 0; //a == 13
Estábamos hablando de ello y preguntándonos algunas cosas.
- ¿Como funciona? Nuestra teoría era que el uso de dicho operador convertía el número en un número entero, eliminando así la parte fraccionaria.
- ¿Tiene alguna ventaja sobre hacerlo
Math.floor
? ¿Quizás sea un poco más rápido? (juego de palabras no intencionado) - ¿Tiene alguna desventaja? ¿Quizás no funciona en algunos casos? La claridad es obvia, ya que teníamos que resolverlo y bueno, estoy escribiendo esta pregunta.
Gracias.
¿Como funciona? Nuestra teoría era que el uso de dicho operador convertía el número en un número entero, eliminando así la parte fraccionaria.
Todas las operaciones bit a bit, excepto el desplazamiento a la derecha sin signo, >>>
funcionan en enteros de 32 bits con signo. Entonces, el uso de operaciones bit a bit convertirá un flotante en un número entero.
¿Tiene alguna ventaja sobre Math.floor? ¿Quizás sea un poco más rápido? (juego de palabras no intencionado)
http://jsperf.com/or-vs-floor/2 parece un poco más rápido
¿Tiene alguna desventaja? ¿Quizás no funciona en algunos casos? La claridad es obvia, ya que teníamos que resolverlo y bueno, estoy escribiendo esta pregunta.
- No pasará jsLint.
- Sólo enteros con signo de 32 bits
- Comportamiento comparativo extraño:
Math.floor(NaN) === NaN
, mientras(NaN | 0) === 0
Esto es truncamiento en contraposición a piso. La respuesta de Howard es bastante correcta; Pero yo añadiría que eso Math.floor
hace exactamente lo que se supone que debe hacer con respecto a los números negativos. Matemáticamente, eso es lo que es un suelo.
En el caso que describiste anteriormente, el programador estaba más interesado en truncar o eliminar completamente el decimal. Aunque, la sintaxis que usaron oscurece el hecho de que están convirtiendo el flotante en un int.