1、十进制转二进制(0和1形式的表示法)
1.1、十进制整数部分转二进制,思路:
将十进制整数取余,得到一个余数,然后将十进制整数除以2取整得到一个新的十进制整数。
然后再将新的十进制整数取余,又得到一个余数,然后再将新的十进数整数除以2取整又得到一个新的十进制整数,
如此循环,直到得到的十进制整数为1时停止,然后将得到的余数按倒序组合起来。如图

1.2、十进制小数部分转二进制,思路:
将十进制小数部分乘以2,然后得到一个积,然后将积的整数部分取出来,
然后再用剩余的小数乘以2,又得到一个积,然后再将积的整数部分取出。
如此循环,直到剩余的小数部分为0或者达到所要求的精度为止,然后将取出的整数按正序组合起来。

十进制转二进制的代码实现
/**
* 十进制转二进制
* @param {number} num 要转换数字
* @param {number|undefined} digits 小数部分的精度
* @return {string} 返回0和1组成的二进制
* */
const decimalismToBinarySystem = (num, digits) => {
if (typeof num !== "number") return num;
//整数部分
const integerBits = [];
let integer = Math.trunc(num);
while (1) {
if (!integer) {
integerBits.push(0);
break;
}
if (integer === 1) {
integerBits.unshift(1);
break;
}
integerBits.unshift(integer % 2);
integer = Math.trunc(integer / 2);
}
//小数部分
const decimalBits = [];
let decimals = num % 1 * 2;
while (1) {
if (digits && decimalBits.length === digits) break;
if (!decimals) {
decimalBits.push(0);
break;
}
decimalBits.push(Math.trunc(decimals));
decimals = decimals % 1 * 2;
}
return integerBits.concat(['.'], decimalBits).join('');
};
console.log(decimalismToBinarySystem(137.68, 5)); // 10001001.10101
console.log(decimalismToBinarySystem(137.68)); // 10001001.10101110000101000111101011100001010001111010111000011
注:toString方法也可以获取二进制字符串,但是精度可能要自己处理下。
2、二进制(0和1表示法)转十进制

2.1、整数部分计算
// 整数部分 10001001
1 * Math.pow(2, 7) + 0 * Math.pow(2, 6) + 0 * Math.pow(2, 5) + 0 * Math.pow(2, 4) + 1 * Math.pow(2, 3) + 0 * Math.pow(2, 2) + 0 * Math.pow(2,1) + 1 * Math.pow(2, 0)
// 137
2.2、小数部分计算
// 小数部分 10101
1 * Math.pow(2, -1) + 0 * Math.pow(2, -2) + 1 * Math.pow(2, -3) + 0 * Math.pow(2, -4) + 1 * Math.pow(2, -5)
// 0.65625
// 可能你会奇怪为啥计算的值不是0.68,还记得上面十进制小数转二进制的digits参数吗,由于某些浮点数没办法用二进制准确的表示出来,
// 只能通过设置精度或者自动根据IEEE 754标准来保留适当的位数。digits越大计算的值越精确。
// 10001001.10101110000101000111101011100001010001111010111000011 => 0.6800000000000068
二进制转十进制的代码实现
/**
* 二进制转十进制
* @return {string} 返回0和1组成的二进制
* */
const binarySystemToDecimalism = (str) => {
if (typeof str !== "string" || !str) return str;
str = str.split('.');
let integer = 0;
if (str.length && str[0]) {
for (let [index, value] of Object.entries(str[0])) {
integer += +value * Math.pow(2, str[0].length - index - 1);
}
}
let decimals = 0;
if (str.length > 1 && str[1]) {
for (let [index, value] of Object.entries(str[1])) {
decimals += +value * Math.pow(2, -(+index + 1));
}
}
return integer + decimals;
};
binarySystemToDecimalism('10001001.10101'); // 137.65625
binarySystemToDecimalism('10001001.10101110000101000111101011100001010001111010111000011'); // 137.68