JS中的数字表示的几种方式

二进制、八进制、十进制、十六进制

数字和日期 - JavaScript | MDN本章节介绍如何掌握Javascript里的数字和日期类型https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Numbers_and_dates整数以及浮点数的安全范围是什么?

仔细看,JS在表示其他进制的方式,0b11、0o77、0xff 都是以0开头的,因为数字嘛。

二进制(Binary)

    console.log(0b11) // 3
    console.log(0b111)// 7

拓展知识:二进制数据

发送和接收二进制数据 - Web API 接口参考 | MDN可以通过设置一个XMLHttpRequest对象的 responseType属性来改变一个从服务器上返回的响应的数据类型.可用的属性值为空字符串 (默认), "arraybuffer", "blob", "document","json" 和 "text". response属性的值会根据responseType属性包含实体主体(entity body), 它可能会是一个 ArrayBuffer, Blob, Document,JSON, string,或者为NULL(如果请求未完成或失败)https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

八进制(Octal)

在ECMAScript 5 严格模式下禁止使用八进制语法(比如,077)。八进制语法并不是ECMAScript 5规范的一部分,但是通过在八进制数字添加一个前缀0就可以被所有的浏览器支持:0644 === 420 而且 "\045" === "%"。在ECMAScript 6中使用八进制数字是需要给一个数字添加前缀"0o",是标准的且得到支持的八进制。

    console.log(0o77) // 63
    console.log(0o777)// 511

十进制

Number的安全数:正负2^53 -1

        console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
        console.log(Number.MIN_SAFE_INTEGER) // -9007199254740991

十六进制(Hexadecimal numbers)

    console.log(0xf) // 15
    console.log(0xff) // 255

指数形式

    console.log(0.1e3) // 100
    console.log(20e3) // 20000

BigInt

BigInt 是一种内置对象,它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。

它在某些方面类似于 Number ,但是也有几个关键的不同点:不能用于 Math 对象中的方法;不能和任何 Number 实例混合运算,两者必须转换成同一种类型。在两种类型来回转换时要小心,因为 BigInt 变量在转换成 Number 变量时可能会丢失精度。

const theBiggestInt = 9007199254740991n;
​
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
​
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
​
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
​
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n

在 JSON 中使用

对任何 BigInt 值使用 JSON.stringify() 都会引发 TypeError,因为默认情况下 BigInt 值不会在 JSON 中序列化。但是,如果需要,可以实现 toJSON 方法:

BigInt.prototype.toJSON = function() { return this.toString(); }

JSON.stringify 现在生成如下字符串,而不是抛出异常:

JSON.stringify(BigInt(1));
// '"1"'

Number上有一些属性:

JavaScript 能够准确表示的整数范围在-2^532^53之间(不含两个端点),超过这个范围,无法精确表示这个整数

console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
console.log(Math.pow(2, 53) - 1)     // 9007199254740991

Math对象上的一些属性值

Math - JavaScript | MDN

Math.PI 圆周率

方法:Math.pow(x, y) 返回一个数的 y 次幂。

console.log(Math.pow(2, 53) - 1)     // 9007199254740991

还有一些方法需要传进制:

Number.prototype.toString(radix)指定要用于数字到字符串的转换的基数(从2到36)。如果未指定 radix 参数,则默认值为 10。

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。

关于进制在实际开发中的问题:JSON序列化数字,损失精度

9007199254740991 是16位的数字,当长度大于16位后,JSON.stringify将出现转义出错

    const obj = {
      a: 90071992547409921
    }
    console.log(JSON.stringify(obj)) //{"a":90071992547409920}


    const obj = {
      a: 90071992547409921n
    }
    console.log(JSON.stringify(obj)) //  Do not know how to serialize a BigInt

做法是:将超出Number的安全正数,转换为字符串,再进行JSON序列化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值