Node.js的Javascript中的Buffer.writeFloatBE

时间:2016-05-19 13:09:06

标签: javascript node.js express

以下代码会像以下一样浮动到整数转换:

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)并返回浮点数?

1 个答案:

答案 0 :(得分:0)

我们可以逐个恢复每个操作,最后得到以下代码:

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

这样可以在正浮动上正常工作,所以我们应该特别注意消极的。

来自the answer @PleaseStand:

  

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

     

如果x在 - (2 31 )和2 31 之间不存在 - 将发生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));
}