AJAXBBS.NET   yemoo's blog

专注WEB前端及RIA技术 -- XHTML/CSS/JavaScript/Ajax/RIA

导航

« 【转】A List Apart 经典文章中译:Web设计之道(下)监听window.open页面的onload事件 »

有关JavaScript中Number数据类型的长度

一次项目开发中发现了一个很严重的问题,服务端传过来的数据被修改,比如身份证:{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以上,最好还是用字符串表示吧,其它的应该没有什么好的解决办法。

以上纯属个人无聊,如对你有用,纯属巧合。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

About ME

  • 网名:网者归来、yemoo,长期并将继续投身于WEB前端相关技术的学习和推广的大军中,目前就职于杭州淘宝网,从事前端开发相关工作,有事可E-MAIL联系我。
  • Email1:netman8410#163.com
    Email2:yuanzhang#taobao.com
    PS:牛B都是从傻B变来的

Search

网站分类

最近发表

最新评论及回复

文章归档

Powered By Z-Blog 1.8 Arwen Build 81206  豫ICP备06015770号

Copyright 2006-2009 AJAXBBS.NET. All Rights Reserved.