JS中(JS转换json/jQuery转换json)中的long型大数精度丢失问题
·
最近在后台向前台传输对象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传到前台去 .
当然 , 前端也并非处理不了这个问题 . 只是非常费劲 . 可以参看这篇知乎的文章点击打开链接
更深层次的研究可以参看本篇文章 深究浏览器长整型数值精度丢失问题
更多推荐
所有评论(0)