以下代码会像以下一样浮动到整数转换:
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)并返回浮点数?
答案 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));
}