2011-09-24 18 views
5

Esta pregunta es probablemente "inusual", pero necesito lanzar un flotador Number a un número entero Number, sin modificar su representación binaria.Reinterpretar el número de coma flotante al entero

Por ejemplo, el flotador 37.5 está representado por los bytes 0x42160000 (según IEEE 754). Necesito reinterpretar 0x42160000 como un número entero, es decir, el número 1108738048

¿Cómo puedo hacer esto? Estoy pensando que podría haber algunos trucos de bit para lograr esto?

Para ser claros, soy no buscando Math.round o parseInt.

Respuesta

5

Typed arrays pueden ser útiles aquí: http://jsfiddle.net/rtYrM/.

// create array which is specialized for holding 1 float value 
var floatArray = new Float32Array(1); 

// set the float value 
floatArray[0] = 37.5; 

// use its buffer (4 bytes for 1 float) and pass it to an array 
// specialized for integers 
var intArray = new Int32Array(floatArray.buffer); 

// the integer array will interpret the buffer bytes as an integer, 
// which seems to be just what you want 
intArray[0] === 1108738048; //true 

intArray.buffer llevará a cabo los mismos bytes como floatArray.buffer, pero al no acceder a él con el tampón pero con la propia matriz, leerá los bytes como el tipo especificado por el conjunto de tipos: como enteros para Int32Array, y como flotadores para Float32Array.

En este caso (en base 10):

  • floatArray se establece en el valor [ 37.5 ].
  • floatArray.buffer se establece automáticamente en los valores [ 0, 0, 22, 66 ].
  • floatArray.buffer se pasa a una nueva matriz de enteros, intArray.
  • intArray.buffer por lo tanto, contiene los valores [ 0, 0, 22, 66 ] también.
  • intArray contiene el valor [ 1108738048 ], calculado con su búfer.
+0

Impresionante. ¿Es compatible con todos los principales navegadores? Nunca he oído hablar de Float32Array o Int32Array ... – Bart

+0

@Bart: en realidad, no lo creo, es totalmente nuevo, de hecho. Funciona en Chrome: déjame probar otros navegadores. – pimvdb

+0

@Bart: Soporte en Firefox (al menos Firefox 6), Chrome y Safari. No en IE ni en Opera. Tengo miedo ... – pimvdb

0

No creo que Javascript incluya ningún mecanismo para hacer esto. Existe un método java.lang.Float.floatBitsToIntBits() en Java, por lo que, dependiendo del entorno en el que se encuentre, es posible que pueda utilizarlo. Si todo lo demás falla, es posible que deba enviar los datos nuevamente al servidor que se va a convertir. Alternativamente, he visto intentos en los métodos de Javascript para hacer esta conversión, pero nunca uno que fue 100% completo y correcto.

+0

Bueno, un método incompleto es mejor que ninguno en absoluto. ¿Podrías mostrarme algunos intentos? – Bart

+1

Hay esto: http://stackoverflow.com/questions/3077718/converting-a-decimal-value-to-a-32bit-floating-point-hexadecimal/3117567#3117567. A pesar del título del hilo, muestra una conversión en la otra dirección. –

Cuestiones relacionadas