This question asks whether there is some JavaScript standard for parsing binary floating-point numbers, as if parseFloat()
could have taken a second radix parameter to parse the binary number 0.101
like this: parseFloat('0.101', 2)
.
While there is no such standard, there is an easy and direct way to solve this.
If we represent the binary number 0.101
as a binary fraction, it is easily converted to a decimal fraction:
0.1012 = 1012/10002 = (5/8)10 = 0.625
The following one-line expression translates this to JavaScript. Here, num
could be any type of binary number (represented as a string), including negative numbers:
parseInt(num.replace('.', ''), 2) / Math.pow(2, (num.split('.')[1] || '').length)
The solution is easily adapted to floating-point numbers in any base between 2 and 36, and we can wrap it in our own parseFloatRadix()
function:
function parseFloatRadix(num, radix) {
return parseInt(num.replace('.', ''), radix) /
Math.pow(radix, (num.split('.')[1] || '').length)
}
test('0.101', 2, 0.625);
test('0.011', 2, 0.375);
test('0.0011', 2, 0.1875);
test('-011', 2, -3);
test('011', 2, 3);
test('-1100.0011', 2, -12.1875);
test('1100.0011', 2, 12.1875);
test('0.00011001100110011001100', 2, 0.09999990463256836);
test('ABC', 16, 2748);
test('-0.DEF', 16, -0.870849609375);
test('ABC.DEF', 16, 2748.870849609375);
test('-102.201', 3, -11.703703703703704);
test('-Z.ZZZ', 36, -35.99997856652949);
function test(num, radix, expected){
let result = parseFloatRadix(num, radix);
console.log(num + ' (base ' + radix +') --> ' + result +
(result === expected ? ' (OK)' : ' (Expected ' + expected + ')'));
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…