Reinterpret_cast浮点数为整数

时间:2011-09-24 11:35:25

标签: javascript casting floating-point integer typed-arrays

这个问题可能是“不寻常的”,但我需要将一个浮点Number强制转换为整数Number,而不修改其二进制表示。

例如,float 37.5由字节0x42160000表示(根据IEEE 754)。 我需要将0x42160000重新解释为整数,即数字1108738048

我该怎么做?我想可能有一些按位的技巧来实现这个目标?

要清楚,我正在寻找Math.roundparseInt

2 个答案:

答案 0 :(得分:5)

Typed arrays可以派上用场: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将保持与floatArray.buffer相同的字节,但是不通过缓冲区访问它而是使用数组本身,它将读取这些字节作为类型化数组指定的类型:as integer对于Int32Array,以及Float32Array的浮点数。

在这种情况下(在基数10中):

  • floatArray设置为值[ 37.5 ]
  • floatArray.buffer会自动设置为值[ 0, 0, 22, 66 ]
  • floatArray.buffer传递给新的整数数组intArray
  • 因此,
  • intArray.buffer也包含值[ 0, 0, 22, 66 ]
  • intArray包含使用其缓冲区计算的值[ 1108738048 ]

答案 1 :(得分:0)

我不相信Javascript包含任何执行此操作的机制。 Java中有一个方法java.lang.Float.floatBitsToIntBits(),因此根据您的预期环境,您可以使用它。如果所有其他方法都失败了,您可能必须将数据发送回要转换的服务器。或者,我已经在Javascript方法中看到尝试进行此转换,但从来没有一个100%完整且正确的。