Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将浮点数重新解释为整数_Javascript_Casting_Floating Point_Integer_Typed Arrays - Fatal编程技术网

Javascript 将浮点数重新解释为整数

Javascript 将浮点数重新解释为整数,javascript,casting,floating-point,integer,typed-arrays,Javascript,Casting,Floating Point,Integer,Typed Arrays,这个问题可能是“不寻常的”,但我需要将浮点数字转换为整数数字,而不修改其二进制表示形式 例如,浮点37.5由字节0x42160000表示(根据IEEE 754)。 我需要将0x42160000重新解释为整数,即数字1108738048 我该怎么做?我在想可能会有一些按位的技巧来实现这一点 明确地说,我不是在寻找Math.round或parseInt,我不相信Javascript包含任何实现这一点的机制。java中有一个方法java.lang.Float.floatBitsToIntBits(),

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

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

我该怎么做?我在想可能会有一些按位的技巧来实现这一点


明确地说,我不是在寻找
Math.round
parseInt

,我不相信Javascript包含任何实现这一点的机制。java中有一个方法
java.lang.Float.floatBitsToIntBits()
,因此根据您的预期环境,您可能能够利用它。如果所有其他操作都失败,则可能必须将数据发送回要转换的服务器。或者,我见过Javascript方法尝试进行这种转换,但从来没有一种方法是100%完整和正确的

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]

好吧,不完整的方法总比没有好。你能告诉我一些尝试吗?有这个:。尽管标题是线程,但他正在向另一个方向转变。太棒了。所有主流浏览器都支持这一点吗?我从来没有听说过Float32Array或Int32Array…@Bart:我真的不这么认为-事实上它是全新的。它可以在Chrome上运行——让我测试一下其他浏览器。@Bart:Firefox(至少Firefox 6)、Chrome和Safari中的支持。恐怕不是在IE或歌剧中…好的,谢谢。我想我暂时可以不用IE和歌剧了。
// 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