UNPKG

xms-basic-util

Version:

js基础工具类集合,集成方便后期调用,通过webpack编译,支持多种平台,如es6、node、浏览器引入等 ## 使用 ### es6方法 - 安装 ``` npm install xms-basic-util ``` - 导入 ``` import xmsBasicUtil from 'xms-basic-util' //日期转换工具对象 const dateFormat = xmsBasicUtil.dateFormat; //数字处理工具对象 const mathUtil = xmsBasicUt

142 lines (105 loc) 4.58 kB
## JS实现十进制与二进制的互相转换 #### 1. 十进制转换为二进制 `toString()` 方法可把一个`Number`对象转换为一个字符串,并返回结果。 - 语法 ``` NumberObject.toString(radix) ``` 参数 | 描述 ---|--- radix | 可选。规定表示数字的基数,使 2 ~ 36 之间的整数。若省略该参数,则使用基数 10 - 返回值 数字的字符串表示。例如,当 radix 为 2 时,NumberObject 会被转换为二进制值表示的字符串。 - 示例 ``` var number = new Number(1337); console.log(number.toString()) // 1337 console.log(number.toString(2)) // 10100111001 console.log(number.toString(8)) // 2471 console.log(number.toString(16)) // 539 var dot = 1.1 console.log(dot.toString(2)) // 1.000110011001100110011001100110011001100110011001101 console.log(dot.toString(8)) // 1.06314631463146315 console.log(dot.toString(16)) // 1.199999999999a ``` #### 2. 二进制转换为十进制 > 如果使用parseInt(string, radix),返回的是整数,但如果二进制数有小数部分,那小数部分的数值会被直接舍去,不符合一些场景的需求设定 **只有整数的二进制** 如果二进制只有整数,可以使用parseInt,把二进制转十进制 - 语法 ``` parseInt(string, radix) ``` 参数 | 描述 ---|--- string | 必需。要被解析的字符串 radix | 可选。表示要解析的数字的基数 > 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数 1. 如果 string"0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。 2. 如果 string0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。新浏览器都解析成十进制 3. 如果 string1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。 - 示例 ``` var max = 10100111001 console.log(parseInt(max,2)); // 1337 var num = 1100100; console.log(parseInt(num,2)); // 100 ``` **包含小数的二进制** 将二进制数的整数部分和小数部分分别转换,再加起来。 - 整数部分 转换如上。 - 小数部分 根据转换原则,将小数点后的每位二进制数都转换成十进制数,然后将各个位的十进制数加起来,就是完整的小数部分的十进制数了 以0.111为例 小数部分 | 1 | 1 | 1 ---|---|---|--- 基数的多少次幂 |2^(-1)| 2^(-2)| 2^(-3) 每位数字转换过程 | 1*2^(-1)| 1*2^(-2)| 1*2^(-3) 十进制表示 | 0.5| 0.25| 0.125 - 将二进制数的整数部分和小数部分拆分 ``` const binaryFloatNum = 1111011.111 const binaryFloatNumStr = binaryFloatNum.toString() console.log(binaryFloatNumStr) // "1111011.111" const binaryFloatNumArr = binaryFloatNumStr.split(".") console.log(binaryFloatNumArr) // ["1111011", "111"] ``` - 将整个二进制小数转换为十进制数的程序为 ``` /** * 将二进制小数部分转换为十进制数 * @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 ``` >其他进制转换成十进制的实现思路也类似 **[数字工具使用说明](mathUtil.md)**