一次项目开发中发现了一个很严重的问题,服务端传过来的数据被修改,比如身份证:{a:410222333311114444},读取数据中的a字段,发现其值为410222333311114430,开始以为是服务端发送过来的数据有问题,后来测试才发现,到客户端后的数据是正常的,但是读取的结果却与json中存储的数据内容不同。
猜想到可能是JS对长数据自动转换显示了,解决办法很简单,将其作为字符串发送过来即可,如{a:"410222333311114444"},问题虽然解决了,但这个问题一直记在心里,想知道个究竟。
按照原来的猜想,直接做如下测试:<script type="text/javascript">
<!--
document.write(410222333311114444); //运行输出410222333311114430
//-->
</script>
看运行结果与猜想是一致的,后经多次测试发现,如果数据达到达到17位以后就会自动被js引擎给修改,这作何解释,数据也并没有超出JavaScript所能表述的数据的范围(JavaScript能表达的最大的数约等于 1.79E+308)。
网上狂搜一把,好半天才找到一点相关的内容,可以看:http://www.w3school.com.cn/js/as_js_primitivetypes.asp,这个东西以前貌似看过,不过没怎么注意这个,看来我以前看东西不细心啊~~。
提示:也可用 64 位 IEEE 754 形式存储浮点值,这意味着十进制值最多可以有 17 个十进制位。17 位之后的值将被裁去,从而造成一些小的数学误差。接着google了一把“IEEE 754”,找到了相关的解释,大家可以看这篇文章:http://www.pediy.com/bbshtml/bbs6/pediy6610.htm,注意这行: real*8 1位符号位(s)、11位指数(e),52位尾数(m,共64位) 1023(3FFH) 尾数为52位,也就是可以表示的十进制数就是2的53次方减去1,即9007199254740991,超过这个数就可能被JS引擎转换,导致与原数字不一致。
到这里问题已经很清楚了,以后如果数据达到16以上,最好还是用字符串表示吧,其它的应该没有什么好的解决办法。
以上纯属个人无聊,如对你有用,纯属巧合。
网名:网者归来、yemoo,长期并将继续投身于WEB前端相关技术的学习和推广的大军中,目前就职于杭州