在最近的后端传参数的时候发现前端查询的时候的id是错误的,发生了什么。然后给出了’id’: 6545917000273642505 然后传过去的是这样的:6545917000273642000发现了没,前端溢出了数据类型的原因:那就一起来探讨一下前端的整型只有在这个范围内的数字才能够被完整的显示出来:console.log(Number.MAX_SAFE_INTEGER); //9007199254740991
console.log(Number.MIN_SAFE_INTEGER); //-9007199254740991超过了就会溢出:扯出一个问题:javascript只有一个数字类型,它在内部被表示为64位的浮点数,和java的double数字类型一样,就是64位双精度:
float是32位单精度,1位符号位,8位阶码,23位尾数基数=2的 阶码次-1 -1=2^7 -1=127所以就是基数,8位最大时255最小0,0 -127~255-127表示指数范围,1.1中尾数就是0.1所以就是最高位是1后面补充0,如果知道知道一个二进制数的存储方式0.75= (1+1*2^-1)*2^(126-127)=1.5*0.5=0.75,但是0.1是无法被二进制表示出来的所以只能使用一个数无限接近0.1也就是说0.1是不准确的
64位中第1位:符号位,0表示正数,1表示负数
第2位到第12位: 储存指数部分
第13位到第64位:储存小数部分(即有效数字)精度最长为53个二进制位,意味着绝对值小于2的53次方的整数,即-(253-1)到253-1,都可以精确表示
Math.pow(2, 53)
// 9007199254740992
所以阶码1023
0 -1023~2047-1023表示指数范围-1023-1024所以有2^-1023~2^1024
所以换算成十进制,javascript数字最高精度是16位(若整数部分为0,则表示小数点后16位;若整数部分不为0,则表示整体保留16位)
Math.pow(2, 53)// 9007199254740992
Math.pow(2, 53) + 1// 9007199254740992
9007199254740993//9007199254740992
90071992547409921//90071992547409920
0.923456789012345678;//0.9234567890123456
9.23456789012345678;//9.234567890123456
这就是有效数值范围内超过的话就会溢出,就会自动省略例如,所有在一起16位超过了16位的
0.923456789012345678;//0.9234567890123456
9.23456789012345678;//9.234567890123456