The following code does float to integer converting like so:
var buffer = new Buffer(4); buffer.writeFloatBE(number, 0); return -~parseInt(buffer.toString('hex'), 16) - 1;
and its output is like so
(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
How can I reverse this code, insert integer (1056964608) and return a float?
Answer
We could literally revert each operation one by one and end up with the following code:
var hexString = (~-(number + 1)).toString(16); return new Buffer(hexString, 'hex').readFloatBE();
This would work fine on positive floats, so we should take some extra care for negative ones.
From the answer by @PleaseStand:
Tilde operator removes everything after the decimal point because the bitwise operators implicitly convert their operands to signed 32-bit integers.
If x is no between -(231) and 231 – 1 overflow will occur and the number will “wrap around”.
> floatToBin(0.05) '11 1101 0100 1100 1100 1100 1100 1101' > floatToBin(-0.05) '1011 1101 0100 1100 1100 1100 1100 1101'
So, the final function would look like this:
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)); }