【问题标题】:Reinterpret cast floating point number to integer将浮点数重新解释为整数
【发布时间】:2011-09-24 11:35:24
【问题描述】:

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

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

我该怎么做?我在想可能有一些按位技巧来完成这个?

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

【问题讨论】:

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


    【解决方案1】:

    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 ],通过其缓冲区计算得出。

    【讨论】:

    • 太棒了。所有主流浏览器都支持吗?我从未听说过 Float32Array 或 Int32Array...
    • @Bart:我不这么认为——事实上它是全新的。它适用于 Chrome - 让我测试其他浏览器。
    • @Bart:支持 Firefox(至少 Firefox 6)、Chrome 和 Safari。恐怕不在 IE 和 Opera 中...
    • 好的,谢谢。我想我暂时可以不用 IE 和 Opera。
    • 不幸的是,这不适用于 Float64Array :(
    【解决方案2】:

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

    【讨论】:

    • 嗯,一个不完整的方法总比没有好。你能告诉我一些尝试吗?
    • 这里是:stackoverflow.com/questions/3077718/…。尽管有线程标题,但他显示了另一个方向的转换。
    猜你喜欢
    • 2018-06-26
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2014-02-25
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多