这个问题可能是“不寻常的”,但我需要将浮点数Number
转换为整数Number
,而不修改其二进制表示。重新解释将浮点数转换为整数
例如,浮点数37.5
由字节0x42160000
(根据IEEE 754)表示。 我需要重新解释0x42160000
作为整数,即数字1108738048
我该怎么做?我在想,可能会有一些按位技巧来实现这个目标?
要清楚,我是而不是正在寻找Math.round
或parseInt
。
这个问题可能是“不寻常的”,但我需要将浮点数Number
转换为整数Number
,而不修改其二进制表示。重新解释将浮点数转换为整数
例如,浮点数37.5
由字节0x42160000
(根据IEEE 754)表示。 我需要重新解释0x42160000
作为整数,即数字1108738048
我该怎么做?我在想,可能会有一些按位技巧来实现这个目标?
要清楚,我是而不是正在寻找Math.round
或parseInt
。
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
,但不与缓冲而是与阵列本身访问它,它将读取这些字节由类型数组中指定的类型:为整数为Int32Array
,和作为花车Float32Array
。
在这种情况下(在基体10):
floatArray
被设置为值[ 37.5 ]
。floatArray.buffer
自动设置为值[ 0, 0, 22, 66 ]
。floatArray.buffer
被传递给一个新的整数数组intArray
。intArray.buffer
也包含值[ 0, 0, 22, 66 ]
。intArray
包含值[ 1108738048 ]
,用其缓冲区计算。我不相信Javascript包含这样做的任何机制。 Java中有一种方法java.lang.Float.floatBitsToIntBits()
,所以根据您的预期环境,您可能会使用它。如果一切都失败了,您可能需要将数据发送回服务器进行转换。另外,我看过尝试在JavaScript方法来做这种转换,但从来没有一个是100%完整和正确的。
那么,一个不完整的方法总比没有好。你能告诉我一些尝试吗? – Bart
这里是:http://stackoverflow.com/questions/3077718/converting-a-decimal-value-to-a-32bit-floating-point-hexadecimal/3117567#3117567。尽管主题标题,他显示在另一个方向的转换。 –
太棒了。这是所有主流浏览器都支持的吗?我从来没有听说过Float32Array或Int32Array ... – Bart
@Bart:其实我不这么认为 - 事实上它是全新的。它适用于Chrome - 让我测试其他浏览器。 – pimvdb
@Bart:支持Firefox(至少Firefox 6),Chrome和Safari。不在IE和Opera中恐怕... – pimvdb