Javascript的安全整数精度问题

Summary: Author: 张亚飞 | Read Time: 1 minute read | Published: 2016-03-08
Filed under Categories: LinuxTags: Note,

JavaScript的安全整数精度问题

最近遇到一个问题,就是传了一个超级大的uint64,结果前端发现数字对不上,精度丢失了!原因就在于,JS的Number是 “64-bit floating point IEEE 754 number”。 最大能表示的数是 Number.MAX_SAFE_INTEGER,一般来说,就是:

2^53-1, 或者 9,007,199,254,740,991

使用 Javascript 传到后端

{
    "unum": 756273004521996288
}

变成了

{
    "unum": 756273004521996300
}

查 Mysql 数据库也是糢糊近似查询

  • 756273004521996224 得出 756273004521996300 的结果
  • 756273004521996223 就查不到结果
select * from cdn_user where uno = 756273004521996224
582961	SASMt8Naa0Q1tPezTNgmr60S84dvYp2F	20284	756273004521996300	启航
595199	SASMt8Naa0Q1tPezTNgmr60S84dvYp2F	20726	756273004521996300	启航
  • 1142761904413061120 得出 1142761904413061100 的结果
select * from cdn_user where uno = 1142761904413061120
598217,SASMt8Naa0Q1tPezTNgmr60S84dvYp2F,20726,1142761904413061100,52Hertz

查以下两个数字转二进制是一样的

756273004521996288 756273004521996227

当JS遇到uint64:JS整数溢出问题 JS 中的 MAX_VALUE 和 MAX_SAFE_INTEGER 是怎么来的

参考

Comments

Cor-Ethan, the beverage → www.iirii.com