Number在JavaScript中与其他强类型编程语言(如C、Java)不同,JavaScript不区分整数值和浮点值。我们可以发现10===10.0//true。那是因为JavaScript的数值类型是基于IEEE754标准中的“双精度”格式,即64位二进制,它以如下格式存储数据。符号位:1位(0表示正数,1表示负数)指数:11位有效位和精度:53位(显式存储52位)在二进制中,计算机内部存储有效数字,第一个有效数字必须是1,所以这个1不会被存储。所以52位有效位可以存储53位。这里可以提一点:二进制浮点数最大的问题是在处理0.1+0.2时,实际结果不是0.3,而是一个比较接近的数0.300000000000000004。这也是因为在计算的时候,会先转换成二进制,然后再计算造成的偏差。因为我们在JavaScript或其他遵循IEEE754规范的语言中处理带有有效数字的数字时必须特别注意。JavaScript的数字格式也决定了JavaScript可以安全表示的整数范围是-2^53+1~2^53-1。这里我们可以先明确一下“安全”的概念:它可以准确地表示为一个IEEE-754双精度数,它的IEEE-754表示不能是对任何其他整数进行四舍五入以适应IEEE-754表示的结果。例如,2^53-1是一个安全整数,可以精确地表示为在任何IEEE-754舍入模式下没有其他整数舍入到该整数。相比之下,2^53不是安全整数,可以用IEEE-754表示,但是2^53+1不能直接用IEEE-754表示,round-to-nearestandroundingtowardszero,会四舍五入到2^53。可以参考Number.isSafeInteger()的定义。在ES2020之前,BigInt类型在JavaScript中只有一种数值类型:number(number),后来为了安全起见,表示-9007199254740991~9007199254740991安全范围之外的数字。引入了BigInt类型。一般计算机将整数存储在CPU寄存器中(现在一般是32位或64位宽,JS是64位的),或者存储在寄存器大小的内存块中,这会带来安全问题。BigInt类型用于精度。它正在内存中分配一个对象。我们让它足够大,可以将BigInt的所有位保存在一系列块中,我们称之为“数字”https://v8.dev/blog/bigint如何使用BigInt()构造直接将n附加到数字函数constbigInt=9007199254740992n;//通过直接在数字后面加上nconstbigNumber=BigInt(9007199254740992);//对十进制数使用BigInt函数constbigString=BigInt("9007199254740992");//String类型使用BigInt函数,先隐式转换为十进制数,再显式转换为BigIn类型constbigHex=BigInt(0x20000000000000);//对十六进制数使用BigInt函数constbigBin=BigInt(0b10000000000000000000000000000000000000000000000000)//对二进制数使用BigInt以上操作生成的值为9007199254740992n;BigInt类型的运算在BigInt中可以使用如下运算符:符号名+加法*乘法-减法%余数**求幂<<左移>>右移当BigInt使用/运算符时,带小数的运算会四舍五入。const预期=4n/2n;//2nconst四舍五入=5n/2n;//2n,不是2.5n,因为BigInt是有符号的,>>>(unsignedrightshift)不能用于BigInt运算的考虑BigInt类型虽然和Number很相似,可以做各种数学运算,但是要交两点运行时注意:BigInt类型不能使用Math对象中的方法。不能与Number实例混合。因为JavaScript在处理不同类型的操作时会将它们转换为相同的类型,而BigInt类型变量隐式转换为Number类型时,可能会丢失精度或直接报错。常量数=1;constbigInt=9007199254740993n;数字+大整数;//TypeError:CannotmixBigIntandothertypesBigInt类型与其他类型的比较BigInt类型的比较与JavaScript中的其他类型比较相同,分为松散相等和严格相等。constbigInt=2n;constint=2;conststring="2";bigInt==int;//truebigInt==字符串;//truebigInt===int;//falsebigInt===字符串;//错误的
