二进制、八进制、十进制、十六进制
数字和日期 - 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
拓展知识:二进制数据
八进制(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^53
到2^53
之间(不含两个端点),超过这个范围,无法精确表示这个整数
console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991
console.log(Math.pow(2, 53) - 1) // 9007199254740991
Math对象上的一些属性值
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序列化