来源于进制转化
/**
* 将二进制小数部分转换为十进制数
* @param binaryFloatPartArr 二进制小数部分中由小数各位组成的数组
*/
function eachBinaryFloatPartToDecimal(binaryFloatPartArr) {
return binaryFloatPartArr.map((currentValue, index) => {
return Number(currentValue) * Math.pow(2, (-(index + 1)))
})
}
/**
* 将二进制小数(包含整数部分和小数部分)转换为十进制数
* @param binaryNum 二进制数(可能是整数,也可能是小数)
*/
function binaryFloatToDecimal(binaryNum) {
// 如果该二进制只有整数部分则直接用 parseInt(string, radix) 处理
if (Number.isInteger(binaryNum)) {
return parseInt(binaryNum, 2)
} else {
const binaryFloatNumArr = binaryNum.toString().split(".")
// 将二进制整数转换为十进制数
const binaryIntParStr = binaryFloatNumArr[0]
const decimalIntPartNum = parseInt(binaryIntParStr, 2)
// 将二进制小数部分转换为十进制数
const binaryFloatPartArr = binaryFloatNumArr[1].split("")
const eachDecimalFloatPartNum = eachBinaryFloatPartToDecimal(binaryFloatPartArr)
const deciamlFloatPartNum = eachDecimalFloatPartNum.reduce((accumulator, currentValue) => { return accumulator + currentValue })
return decimalIntPartNum + deciamlFloatPartNum
}
}
console.log(binaryFloatToDecimal(1111011.111)) // 123.875
console.log(binaryFloatToDecimal(1111011)) // 123
console.log(binaryFloatToDecimal(0.111)) // 0.875
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…