Node.js's Buffer.writeFloatBE in Javascript

Node.js's Buffer.writeFloatBE in Javascript

本文关键字:Buffer writeFloatBE in Javascript js Node      更新时间:2023-09-26

以下代码进行浮点到整数的转换,如下所示:

var buffer = new Buffer(4);
buffer.writeFloatBE(number, 0);
return -~parseInt(buffer.toString('hex'), 16) - 1;

它的输出是这样的

(float)0.05 = (int)1028443341       
(float)-0.05 = (int)-1119040307
(float)0.1  = (int)1036831949       
(float)-0.1  = (int)-1110651699
(float)0.2  = (int)1045220557       
(float)-0.2  = (int)-1102263091
(float)0.5  = (int)1056964608       
(float)-0.5  = (int)-1090519040

如何反转此代码,插入整数(1056964608)并返回浮点值?

我们可以逐个还原每个操作,最终得到以下代码:

var hexString = (~-(number + 1)).toString(16);
return new Buffer(hexString, 'hex').readFloatBE();

这在正浮点上可以很好地工作,所以我们应该对负浮点格外小心。

来自@PleaseStand:的回答

Tilde运算符删除小数点后的所有内容,因为逐位运算符将其操作数隐式转换为有符号的32位整数。

如果x在-(231)和2-1之间为否,则将发生溢出;"环绕";。

> floatToBin(0.05)
'11 1101 0100 1100 1100 1100 1100 1101'
> floatToBin(-0.05)
'1011 1101 0100 1100 1100 1100 1100 1101'

所以,最后的功能看起来是这样的:

function intToFloat(number) {
    number = ~-(number + 1);
    if (number < 0) {
        number += Math.pow(2, 32);
    }
    var float = new Buffer(number.toString(16), 'hex').readFloatBE();
    const significantDigits = 5;
    return parseFloat(float.toFixed(significantDigits));
}