用
javascript
實(shí)現(xiàn)十進(jìn)制與二進(jìn)制之間的轉(zhuǎn)換矗积,在網(wǎng)上能找到不少例子,但很多都少考慮了二進(jìn)制小數(shù)轉(zhuǎn)換為十進(jìn)制的情況敞咧,所以在一些摸索和實(shí)現(xiàn)之后棘捣,想把這種情況的實(shí)現(xiàn)分享給你
需求分析
- 二進(jìn)制和十進(jìn)制都可能是 整數(shù) 和 浮點(diǎn)數(shù)(小數(shù))
- 當(dāng)然也可能是正數(shù)和負(fù)數(shù)(因?yàn)樨?fù)數(shù)只需提取一個(gè)負(fù)號(hào)(-),所以該文章以正數(shù)為例)
十進(jìn)制轉(zhuǎn)換為二進(jìn)制
該轉(zhuǎn)換可以用 toString() 方法來實(shí)現(xiàn)
toString()
方法返回一個(gè)表示該對(duì)象的字符串-
語法:
numberObject.toString(radix)
- 描述:把數(shù)字轉(zhuǎn)換為對(duì)應(yīng)的字符串
-
radix
: 可選休建。規(guī)定表示數(shù)字的基數(shù)
radix
:2 ~ 36 之間的整數(shù)乍恐。若省略該參數(shù),則使用基數(shù) 10测砂。但是要注意茵烈,如果該參數(shù)是 10 以外的其他值,則ECMAScript
標(biāo)準(zhǔn)允許實(shí)現(xiàn)返回任意值返回值類型:
string
所以砌些,如果想將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)(整數(shù)和小數(shù)都可以用這種方法)呜投,只需要使用 numberObject.toString(radix)
方法即可
示例:
const decimalNum = 123
console.log(decimalNum.toString(2)) // "1111011"
const decimalFloatNumber = 123.125
console.log(decimalFloatNumber.toString(2)) // "1111011.001"
因?yàn)?toSting()
返回的是表示該對(duì)象的字符串,所以如果最終結(jié)果是要二進(jìn)制數(shù)值的話存璃,可以再用 Number()
函數(shù)轉(zhuǎn)換一下即可
二進(jìn)制轉(zhuǎn)換為十進(jìn)制
網(wǎng)上例子基本都是用
parseInt(string, radix)
仑荐,但如果二進(jìn)制數(shù)有小數(shù)部分,那小數(shù)部分的數(shù)值會(huì)被直接舍去纵东,不符合一些場景的需求設(shè)定
實(shí)現(xiàn)二進(jìn)制(整數(shù)部分&小數(shù)部分)轉(zhuǎn)換為十進(jìn)制的一種方法是:將二進(jìn)制數(shù)分為整數(shù)和小數(shù)兩部分粘招,分別轉(zhuǎn)換為十進(jìn)制數(shù),然后再組合成最終的十進(jìn)制數(shù)值
二進(jìn)制整數(shù)部分轉(zhuǎn)換為十進(jìn)制
這部分很簡單偎球,直接用 parseInt(string, radix)
就可以啦~
-
parseInt()
函數(shù)可解析一個(gè)字符串洒扎,并返回一個(gè)整數(shù) -
parseInt(string, radix)
-
string
: 必需。要被解析的字符串 -
radix
: 可選衰絮。表示要解析的數(shù)字的基數(shù)
-
- radix:該值介于 2 ~ 36 之間逊笆。如果省略該參數(shù)或其值為 0,則數(shù)字將以 10 為基礎(chǔ)來解析岂傲。如果它以 “0x” 或 “0X” 開頭难裆,將以 16 為基數(shù)。如果該參數(shù)小于 2 或者大于 36镊掖,則
parseInt
() 將返回NaN
二進(jìn)制小數(shù)部分轉(zhuǎn)換為十進(jìn)制
先不用代碼實(shí)現(xiàn)乃戈,整理整理思路,根據(jù)轉(zhuǎn)換原則亩进,就是將小數(shù)點(diǎn)后的每位二進(jìn)制數(shù)都轉(zhuǎn)換成十進(jìn)制數(shù)症虑,然后將各個(gè)位的十進(jìn)制數(shù)加起來,就是完整的小數(shù)部分的十進(jìn)制數(shù)了
比如:1111011.111 的小數(shù)部分為:111
轉(zhuǎn)換過程為:
對(duì)應(yīng)代碼實(shí)現(xiàn)為:
- 將二進(jìn)制數(shù)的整數(shù)部分和小數(shù)部分分別取出
- 先將二進(jìn)制數(shù)轉(zhuǎn)換為字符串
- 用
split
方法归薛,取出二進(jìn)制數(shù)的整數(shù)部分和小數(shù)部分
const binaryFloatNum = 1111011.111
const binaryFloatNumStr = binaryFloatNum.toString()
console.log(binaryFloatNumStr) // "1111011.111"
const binaryFloatNumArr = binaryFloatNumStr.split(".")
console.log(binaryFloatNumArr) // ["1111011", "111"]
-
將小數(shù)部分轉(zhuǎn)換為十進(jìn)制數(shù)
- 取出小數(shù)部分
- 將小數(shù)部分的每位取出
- 將取出的每位分別轉(zhuǎn)換為十進(jìn)制數(shù)
- 將轉(zhuǎn)換之后的各個(gè)十進(jìn)制數(shù)相加谍憔,得到由整個(gè)二進(jìn)制小數(shù)部分轉(zhuǎn)換成的十進(jìn)制數(shù)
const binaryFloatPartStr = binaryFloatNumArr[1] // "111"
const binaryFloatPartArr = binaryFloatPartStr.split("") // ["1", "1", "1"]
/**
* 將 binaryFloatPartArr 數(shù)組中的每項(xiàng)轉(zhuǎn)換為對(duì)應(yīng)的小數(shù)部分的十進(jìn)制數(shù)
* @param decimalArray 二進(jìn)制小數(shù)部分中由小數(shù)各位組成的數(shù)組
*/
function eachBinaryFloatPartToDecimal (binaryFloatPartArr) {
return binaryFloatPartArr.map((currentValue, index) => {
return Number(currentValue) * Math.pow(2, (-(index + 1)))
})
}
const eachDecimalFloatPartNum = eachBinaryFloatPartToDecimal(["1", "1", "1"])
console.log(eachDecimalFloatPartNum) // [0.5, 0.25, 0.125]
/**
* 將 binaryFloatPartArr 數(shù)組中的每項(xiàng)轉(zhuǎn)換為對(duì)應(yīng)的小數(shù)部分的十進(jìn)制數(shù)
* @param decimalArray 二進(jìn)制小數(shù)部分中由小數(shù)各位組成的數(shù)組
*/
const deciamlFloatPartNum = eachDecimalFloatPartNum.reduce((accumulator, currentValue) => {return accumulator + currentValue})
console.log() // 0.875
將整個(gè)二進(jìn)制小數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的程序?yàn)椋?/h2>
ps: 將下面程序復(fù)制到控制臺(tái)可直接運(yùn)行
/**
* 將二進(jìn)制小數(shù)部分轉(zhuǎn)換為十進(jìn)制數(shù)
* @param binaryFloatPartArr 二進(jìn)制小數(shù)部分中由小數(shù)各位組成的數(shù)組
*/
function eachBinaryFloatPartToDecimal(binaryFloatPartArr) {
return binaryFloatPartArr.map((currentValue, index) => {
return Number(currentValue) * Math.pow(2, (-(index + 1)))
})
}
/**
* 將二進(jìn)制小數(shù)(包含整數(shù)部分和小數(shù)部分)轉(zhuǎn)換為十進(jìn)制數(shù)
* @param binaryNum 二進(jìn)制數(shù)(可能是整數(shù)匪蝙,也可能是小數(shù))
*/
function binaryFloatToDecimal(binaryNum) {
// 如果該二進(jìn)制只有整數(shù)部分則直接用 parseInt(string, radix) 處理
if (Number.isInteger(binaryNum)) {
return parseInt(binaryNum, 2)
} else {
const binaryFloatNumArr = binaryNum.toString().split(".")
// 將二進(jìn)制整數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)
const binaryIntParStr = binaryFloatNumArr[0]
const decimalIntPartNum = parseInt(binaryIntParStr, 2)
// 將二進(jìn)制小數(shù)部分轉(zhuǎn)換為十進(jìn)制數(shù)
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
ps: 將下面程序復(fù)制到控制臺(tái)可直接運(yùn)行
/**
* 將二進(jìn)制小數(shù)部分轉(zhuǎn)換為十進(jìn)制數(shù)
* @param binaryFloatPartArr 二進(jìn)制小數(shù)部分中由小數(shù)各位組成的數(shù)組
*/
function eachBinaryFloatPartToDecimal(binaryFloatPartArr) {
return binaryFloatPartArr.map((currentValue, index) => {
return Number(currentValue) * Math.pow(2, (-(index + 1)))
})
}
/**
* 將二進(jìn)制小數(shù)(包含整數(shù)部分和小數(shù)部分)轉(zhuǎn)換為十進(jìn)制數(shù)
* @param binaryNum 二進(jìn)制數(shù)(可能是整數(shù)匪蝙,也可能是小數(shù))
*/
function binaryFloatToDecimal(binaryNum) {
// 如果該二進(jìn)制只有整數(shù)部分則直接用 parseInt(string, radix) 處理
if (Number.isInteger(binaryNum)) {
return parseInt(binaryNum, 2)
} else {
const binaryFloatNumArr = binaryNum.toString().split(".")
// 將二進(jìn)制整數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)
const binaryIntParStr = binaryFloatNumArr[0]
const decimalIntPartNum = parseInt(binaryIntParStr, 2)
// 將二進(jìn)制小數(shù)部分轉(zhuǎn)換為十進(jìn)制數(shù)
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