问题图
- Number转换19位(
6145390195186705543
)后结果为6145390195186705000
1645668315(1).png
造成原因:看网上资料说:js的number类型有个最大安全值,即
2的53次方(9007199254740992)
,超过这个值就会出现精度丢失的问题。
经过个人测试,上面这个说法还是不准确的,应该是超过16位出现精度丢失,16位以后的数字都会转换成0。
Number转换16位和17位的差别
- Number转换16位正常
- Number转换17位精度丢失,16位以后的数字都会转换成
0
1645668783(1).png
解决方案:使用BigInt 转换数字
BigInt
是一种内置对象,它提供了一种方法来表示大于2^53 - 1
的整数。这原本是 Javascript中可以用Number表示的最大数字。BigInt
可以表示任意大的整数BigInt 转换后要进行加减乘除运算的话,另一个也必须要经过BigInt 转换
let str = '6145390195186705543';
console.log(Number(str)) // 6145390195186705000
console.log(Number(str) + 1) // 6145390195186705000
console.log(BigInt(str)) // 6145390195186705543n
console.log(BigInt(str) + 1) // 报错 Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
let = BigInt(str) + BigInt(1);
console.log(num) // 6145390195186705544n
console.log(String(num).split('n')[0]) // 6145390195186705544