在JavaScript中,由于计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示。
js的整数和浮点数都属于Number类型的,所有数字都是以64位浮点数形式存储。所以我们在前端打印的时候,
发现一个很奇怪的问题,就是当console.log(1.00)时,我们发现打印结果是1,后边的.00都被舍去。虽然数值是正确的,
但是和理想结果有些偏差。

针对雪花算法出现的问题

在做雪花算法的时候,说过使用model中的bigint是最好的存储方式,但是在做的时候发现一个问题,就是在前端展示出现展示效果问题,话不多说,上代码

这是我保存数据库的结果

数据库展示结果

这是我后端获取数据

后端展示数据

这是我前端获取数据的结果

前端获取数据
但是在我前端获取数据结果的时候,发现了一件很怪异的事情,就是js自动将我的数据给修改了,也就是前16位都是对着的。经过测试
发现,我的后端数据没有问题,在传递给前端的时候出现了差错,经过咨询和百度,发现了是js精度丢失的问题。
最常用的解决办法就是使用字符串类型。于是我把数据库的bitint类型给改成了varchar。完美解决。

JavaScript的16位长度数字不变,超过就发生精度丢失问题。

针对数字丢失问题,我做了实验。

16位数字没变
1
2
3
4
5
mounted(){
console.log('最大安全数',1111111111111111)
}

// 最大安全数 1111111111111111
17位发生变化
1
2
3
4
5
mounted(){
console.log('最大安全数',11111111111111111)
}

// 最大安全数 11111111111111112
20位发生变化
1
2
3
4
mounted(){
console.log('最大安全数',11111111111111111111)
}
// 最大安全数 11111111111111110000

根据以上代码,我们可以清晰看到在16位整数可以发现数字没有变化,但是在第17位的时候就发生了变化,长度越长后边都以0显示。

解决办法:

对于整数,前端出现问题的几率可能比较低,毕竟很少有业务需要需要用到超大整数,只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度。
对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)

评论





载入天数...载入时分秒...

Blog content follows the Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) License

Use WZH as theme, total visits times