返回顶部
首页 > 资讯 > 精选 >JavaScript中的进制与进制转换是什么
  • 662
分享到

JavaScript中的进制与进制转换是什么

2023-07-05 04:07:33 662人浏览 独家记忆
摘要

这篇“javascript中的进制与进制转换是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript中的进制

这篇“javascript中的进制与进制转换是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript中的进制与进制转换是什么”文章吧。

进制介绍

JavaScript 中提供的进制表示方法有四种:十进制、二进制、十六进制、八进制。

对于数值字面量,主要使用不同的前缀来区分:

  • 十进制(Decimal):取值数字 0-9;不用前缀。

  • 二进制(Binary):取值数字 01 ;前缀 0b0B

  • 十六进制(Hexadecimal):取值数字 0-9a-f ;前缀 0x0X

  • 八进制(Octal):取值数字 0-7 ;前缀 0o0O (es6规定)。

需要注意的是,非严格模式下浏览器支持:如果有前缀0并且后面只用到 0-7 八个数字的数值时,该数值视为八进制;但如果前缀0后面跟随的数字中有 8或者9,则视为十进制。

严格模式下,如果数字加前缀0,则报错:Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode。

各进制的数值,如果取值数字超过给定的范围,则会报错:Uncaught SyntaxError: Invalid or unexpected token。

在JavaScript内部的默认情况下,二进制、十六进制、八进制字面量数值,都会自动转为十进制进行运算。

0x22 // 340b111 // 70o33 // 270x22 + 0b111 // 410o33 + 12 // 39(0x33).toString() // 51(0x33).valueOf() // 51

除了十进制是Javascript默认的数字进制以外,其他三种进制方式平时使用较少,主要在处理Blob数据、字节编码或者位运算、转义字符等等时候才会碰到。

进制转换

下文将主要讨论进制转换时的问题。

JavaScript 提供了原生函数,进行十进制与其他各进制之间的相互转换。

其中,从其他进制转换成十进制,有三种方式:parseInt()Number()+(一元运算符)。这三种方式都只能转换整数。

从十进制转换成其他进制,可以使用 Number.prototype.toString()。支持小数。

parseInt(str, radix)

第一个参数是需要解析的字符串;其他进制不加前缀。

第二个参数是一个进制基数,表示转换时按什么进制来理解这个字符串,默认值10,表示转十进制。

第二个参数如果非数字,则自动转数字,如无法转称数字则忽略该参数;是数字时,必须是 2-36 的整数,超出该范围,返回 NaN

parseInt('1111', 2) // 15parseInt('1234', 8) // 668parseInt('18af', 16) // 6319parseInt('1111') // 1111

如果不传入第二参数,则 parseInt 会默认使用十进制来解析字符串;但是,如果字符串以 0x 开头,会被认为是十六进制数。

而其他进制的字符串,0o21(八进制)0b11(二进制) 不会以该进制基数自动转换,而是得到 0

所以,在使用 parseInt 进行进制转换时,为了保证运行结果的正确性和稳定性,第二个参数不能省略

parseInt('0x21') // 33parseInt('0o21') // 0parseInt('0b11') // 0parseInt('111', 'add') // 111parseInt('111', '787') // NaN

如果需要解析的字符串中存在对于当前进制基数无效的字符,则会从最高位取有效字符进行转换,没有效字符则返回NaN

parseInt('88kk', 16) // 136,=== 0x88parseInt('kk', 16) // NaN

Number()

可以把字符串转为数字,支持其他进制的字符串,默认转成十进制数字。

字符串中如果存在无效的进制字符时,返回 NaN

记住,需要使用进制前缀,0b0o0x

Number('0b11100') // 28Number('0o33') // 27Number('0x33') //51Number('0x88kk') // NaN

+(一元运算符)

Number() 一样,可以把字符串转为数字,支持其他进制的字符串,默认转成十进制数字。

字符串中如果存在无效的进制字符时,返回 NaN

也需要使用进制前缀。

+'0b11100' // 28+'0o33' // 27+'0x33' //51+'0x88kk' // NaN

可以看到,基本和 Number() 是一样的,也在本质上是对数字的一种转换处理。

Number.prototype.toString(radix)

它支持传入一个进制基数,用于将数字转换成对应进制的字符串,它支持转换小数

未指定默认值为 10,基数参数的范围 2-36,超过范围,报错:RangeError。

15..toString(2) // 1111585..toString(8) // 11114369..toString(16) // 1111(11.25).toString(2) // 1011.01

自定义转换

除了这些原生函数以外,也可以自己实现进制数字之间的转换函数。

根据相应的规则,就可以实现十进制与二进制、十六进制之间的转换的一些方法。

十进制与十六进制转换

以下代码是针对整数在十进制与十六进制之间的转换,根据基本规则进行换算。

十六进制是以 0-9a-f 进行描述数字的一种方式,其中 0-9 取本身数字的值,而 a-f 则取 10-15 的值。

且字母不区分大小写。

function int2Hex (num = 0) {  if (num === 0) {    return '0'  }  const HEXS = '0123456789abcdef'  let hex  while (num) {    hex = HEXS.charAt(num % 16) + hex    num = Math.floor(num / 16)  }  return hex}
function hex2Int (hex = '') {  if (typeof hex !== 'string' || hex === '') {    return NaN  }  const hexs = [...hex.toLowerCase()]  let resInt = 0  for (let i = 0; i < hexs.length; i++) {    const hv = hexs[i]    let num = hv.charCodeAt() < 58 ? +hv : ((code - 97) + 10)    resInt = resInt * 16 + num  }  return resInt}

如果要转换八进制,实际上与十六进制很类似,只需根据八进制的数值范围进行部分改动即可。

八进制一般使用非常少,不单独列出。

下面将重点介绍二进制转换的相关知识,包括小数的二进制表示与转换。

十进制和二进制转换

在十进制与二进制的转换中,我们将考虑小数,理解小数是如何在这两者之间进行转换。

先选定一个数字,比如:11.125 ,我们看下该数字在二进制里的表示:

(11.125).toString(2) // 1011.001

可以看到,11.125 的二进制表示为:1011.001。下面将以这个数字为例进行转换操作。

十进制数字转换成二进制

首先需要了解的是,二进制小数的表示方法是如何得来的:

整数 部分,用二进制表示可以如此计算,数字 11

11 / 2 &mdash;&mdash;&mdash;&mdash; 1
5 / 2 &mdash;&mdash;&mdash;&mdash; 1
2 / 2 &mdash;&mdash;&mdash;&mdash; 0
1 / 2 &mdash;&mdash;&mdash;&mdash; 1

整数部分的规则,得到的结果是 从下往上,倒着排 1011 就是二进制的 11

小数 用二进制表示可以如此计算,小数 0.125

0.125 &times; 2 = 0.25 &mdash;&mdash;&mdash;&mdash; 0
0.25 &times; 2 = 0.5 &mdash;&mdash;&mdash;&mdash; 0
0.5 &times; 2 = 1 &mdash;&mdash;&mdash;&mdash; 1

只有等于1时才结束,如果结果不等于1将会一直循环下去。小数部分的规则,得到的结果是 从上往下,顺着排 0.001 就是二进制的 0.125

整数 + 小数,所以 11.125 的二进制表示方式:1011.001

根据以上整数和小数分开计算的规则,就可以得到一个十进制转二进制的函数,如下:

function c10to2 (num) {  // 整数  const numInteger = Math.floor(num)  // 小数  const numDecimal = num - numInteger  let integers = []  if (numInteger === 0) {    integers = ['0']  } else {    let integerVal = numInteger    while(integerVal !== 1) {      integers.push(integerVal % 2 === 0 ? '0' : '1')      integerVal = Math.floor(integerVal / 2)    }    integers.push('1')  }  const resInteger = integers.reverse().join('')  let decimals = []  if (numDecimal) {    let decimalVal = numDecimal    // 最多取49位的长度    let count = 49    while (decimalVal !== 1 && count > 0) {      decimalVal = decimalVal * 2      if (decimalVal >= 1) {        decimals.push('1')        if (decimalVal > 1) {          decimalVal = decimalVal - 1        }      } else {        decimals.push('0')      }      count--    }  }  const resDecimal = decimals.join('')  return resInteger + (resDecimal ? ('.' + resDecimal) : '')}

小数在转换成二进制时,会存在无限循环的问题,上面的代码里截取了前49个值。

所以,这里就会引出了一个问题,就是常见的一个数字精度问题:0.1 + 0.2 != 0.3

0.1+ 0.2 != 0.3

直接看一下 0.1 转二进制:

0.1 &times; 2 = 0.2
0.2 &times; 2 = 0.4
0.4 &times; 2 = 0.8
0.8 &times; 2 = 1.6
0.6 &times; 2 = 1.2
0.2 &times; 2 = 0.4 // 循环开始
0.4 &times; 2 = 0.8
0.8 &times; 2 = 1.6
0.6 &times; 2 = 1.2
...
...

无限循环

0.2 转二进制:

0.2 &times; 2 = 0.4
0.4 &times; 2 = 0.8
0.8 &times; 2 = 1.6
0.6 &times; 2 = 1.2
0.2 &times; 2 = 0.4 // 循环开始
0.4 &times; 2 = 0.8
0.8 &times; 2 = 1.6
0.6 &times; 2 = 1.2
...
... 无限循环

因为无法得到1,可以发现有限十进制小数, 0.1 转换成了无限二进制小数 0.00011001100...0.2 转成了 0.001100110011...

由于无限循环,必然会导致精度丢失,正好 0.1 + 0.2 计算得到的数字在丢失精度后的最后一位不为0,所以导致结果为:0.30000000000000004

如果截取精度后最后一位为0,那自然就不存在结果不相等的情况,如 0.1 + 0.6 === 0.7,事实上,0.1和0.6转二进制后都会丢失精度,但截取到的数值都是0,所以相等。

同样不相等的还设有 0.1 + 0.7 !== 0.8等等。

所以是计算时转二进制的精度丢失,才导致的 0.1 + 0.2 !== 0.3

在 JavaScript 中所有数值都以 IEEE-754 标准的 64 bit 双精度浮点数进行存储的。 IEEE 754 标准的 64 位双精度浮点数的小数部分最多支持53位二进制位。 因浮点数小数位的限制而需要先截断二进制数字,再转换为十进制,所以在进行算术计算时会产生误差。

这里能看到,如果十进制小数要被转化为有限二进制小数,那么它计算后的小数第一位数必然要是 5 结尾才行(因为只有 0.5 &times; 2 才能变为整数)。

二进制数字转换成十进制

方法是:将二进制分成整数和小数两部分,分别进行转换,然后再组合成结果的十进制数值。

整数部分:这里直接使用 parseInt 函数,parseInt('1011', 2) => 11

小数部分:如 1011.001 的小数位 001,使用下表的计算方式。

小数部分001
基数的位数次幂2^-12^-22^-3
每位与基数乘积0 &times; (2^-1)0 &times; (2^-2)1&times;(2^-3)
每位乘积结果000.125

最后的结果是每位乘积结果相加:0 + 0 + 0.125 = 0.125

整数与小数合起来,就得到了 1011.001 的十进制数字:11.125

根据规则,代码实现如下所示:

function c2To10 (binaryStr = '') {  if (typeof binaryStr !== 'string' || binaryStr === '') {    return NaN  }  const [ binIntStr, binDecStr ] = binaryStr.split('.')  let binDecimal = 0  if (binDecStr) {    binDecimal = [...binDecStr].reduce((res, val, index) => {      res += Number(val) * (2 ** (-(index + 1)))      return res    }, 0)  }  return parseInt(binIntStr, 2) + binDecimal}

以上就是关于“JavaScript中的进制与进制转换是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: JavaScript中的进制与进制转换是什么

本文链接: https://lsjlt.com/news/349559.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中的进制与进制转换是什么
    这篇“JavaScript中的进制与进制转换是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript中的进制...
    99+
    2023-07-05
  • 一文带你搞懂JavaScript中的进制与进制转换
    目录进制介绍进制转换parseInt(str, radix)Number()+(一元运算符)Number.prototype.toString(radix)自定义转换十进制与十六进制...
    99+
    2023-02-21
    JavaScript进制与进制转换 JavaScript进制转换
  • 怎么在JavaScript中将二进制转换为十六进制
    怎么在JavaScript中将二进制转换为十六进制?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript中将二进制转为十六进制的方法var a=100;v...
    99+
    2023-06-14
  • oracle_16进制与10进制转换小示例
    --16进制转10进制,用to_number,里面的参数是16进制的数据,且参数用单引号括起 SQL> select to_number('ff','xx')...
    99+
    2024-04-02
  • 使用JavaScript怎么将10进制转换成36进制
    这期内容当中小编将会给大家带来有关使用JavaScript怎么将10进制转换成36进制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击...
    99+
    2023-06-14
  • php中怎么进行进制转换
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php进行进制转换1、bindec--二进制数转十进制数可以使用 bindec(二进制字符串) 函数,它可把二进制数转换为十进制数。<php echo binde...
    99+
    2019-03-05
    php 进制转换
  • 十六进制、十进制、八进制、二进制常用进制转换
    目录1.基本概念2 计算机语言中常用的进制及表示方法3 十六进制 / 十进制 / 八进制 / 二进制 转换示例二进制(10110.01)2 转为十进制为: (22.25)10八进制(...
    99+
    2022-12-22
    十六进制转换 十进制转换 八进制转换 二进制转换 常用进制转换
  • JavaScript中10进制数怎么转为16进制
    今天小编给大家分享一下JavaScript中10进制数怎么转为16进制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
    99+
    2024-04-02
  • php十进制转八进制的算法是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php十进制转八进制的算法是什么decoct() 函数把十进制数转换为八进制数。如需把八进制转换为十进制,可以利用octdec() 函数。语法decoc&#...
    99+
    2021-10-01
    PHP
  • Oralce中怎么将64进制转换为10进制
    Oralce中怎么将64进制转换为10进制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.实现函 Create Or R...
    99+
    2024-04-02
  • C# 中怎么将16进制转换为10进制
    这期内容当中小编将会给大家带来有关C# 中怎么将16进制转换为10进制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。//十进制转二进制Console.WriteLine(Convert.ToString(...
    99+
    2023-06-17
  • JavaScript如何实现进制转换
    这篇文章主要讲解了“JavaScript如何实现进制转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何实现进制转换”吧! ...
    99+
    2024-04-02
  • PHP八进制转换为十进制
    这篇文章将为大家详细讲解有关PHP八进制转换为十进制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 八进制转换为十进制 简介 八进制是一种基数为 8 的数字系统,其中使用数字 0 到 7。十进制是一...
    99+
    2024-04-02
  • Python进制转换
    进制转换是人们利用符号来计数的方法。 进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。 基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。 位权是指,进位制中每一固定位置对应的单位值。 简单转换理念: 把...
    99+
    2023-01-31
    Python
  • Python3进制转换
    1.进制的表示 二进制:0b 八进制:0o 16进制:0x 2.进制的转换 dec = int(input("输入数字:")) print("十进制数为:", dec) print("转换为二进制为:", bin(d...
    99+
    2023-01-31
  • PHP中进行二进制转换的方法和技巧是什么
    这篇文章主要介绍了PHP中进行二进制转换的方法和技巧是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP中进行二进制转换的方法和技巧是什么文章都会有所收获,下面我们一起来看看吧。首先,我们需要了解一些基础...
    99+
    2023-07-06
  • Python中各进制转换
    本文出自:https://www.2cto.com/kf/201409/332581.htmlpython中所有类型都是作为对象的形式来存在的。在python中没有char型,只有字符串类型,这样我们可能将char型转换为整型时极不方便,但...
    99+
    2023-01-31
    Python 中各进制
  • Python 中10进制数与16进制数相互转换问题
    目录Python 10进制数与16进制数相互转换10进制转为16进制16进制转为10进制扩展:python十进制与十六进制互转Python 10进制数与16进制数相互转换 10进制转...
    99+
    2023-05-20
    python 10进制转16进制 python 进制转换
  • python 实现format进制转换与删除进制前缀
    10进行十进制,十六进制,八进制,二进制的转换: (#:保留进制前缀) 对于带着进制前缀的,如"0x"“0o”“0b”,可以直接在后面加上'x'‘o''b'进行删除: 其他的一些...
    99+
    2024-04-02
  • Java如何实现十进制与十六进制转换
    这篇文章主要介绍了Java如何实现十进制与十六进制转换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。示例:import java.util.HashMap;impo...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作