最近在后台向前台传输对象id时,遇到一个奇怪的问题.类似代码如下:

var str = '{"id":217998860110340096}';
var jsonObj1 = $.parseJson(str);//jQuery插件支持的转换方式
var jsonObj2 = JSON.parse(str);//浏览器支持的转换方式(Firefox,chrome,opera,safari,ie)等浏览器
var jsonObj3 = eval('(' + str + ')'); //Javascript支持的转换方式
console.log('jsonObj1 : ' + jsonObj1.id + ' , jsonObj2 : ' + jsonObj2.id + ' , jsonObj3 : ' + jsonObj3.id);

输出结果令人惊诧,居然没一个对的.

jsonObj1 : 217998860110340100 , jsonObj2 : 217998860110340100 , jsonObj3 : 217998860110340100

之前还以为是json转换的问题 . 后来发现其实不然 , 直接用js输出也会是错误数值.

console.log(217998860110340096);//输出结果 : 217998860110340100

后来才了解到 : 
JS内置有32位整数 , 而number类型的安全整数是53位 . 如果超过53位 , 则精度会丢失 . 正如现在后台传来一个64位的Long型整数 , 超过了53位 , 所以后台返回的值和前台获取的值会不一样 . 
最简单的解决方法 : 后台处理将Long型的数据转换为String类型 --> String.valueOf(Long id)  --> 将string传到前台去 . 

当然 , 前端也并非处理不了这个问题 . 只是非常费劲 . 可以参看这篇知乎的文章点击打开链接

更深层次的研究可以参看本篇文章 深究浏览器长整型数值精度丢失问题

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 3 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐