浅谈JavaScript中小数和大整数的精度丢失..docxVIP

浅谈JavaScript中小数和大整数的精度丢失..docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下面小编就为大家带来一篇浅谈 JavaScript中小数和大整数的精度丢失.小編覚得挺不 错的.现在就分享给大家.也给大家做个参考. 先来看两个问题: 0.1 ? 0.2 ― 0.3; // false 9999999999999999 == 10000000000000000: II true 第一个问题是小数的精度问題.在业界不少博客里已有讨论.第二个问題.去年公司有 个系统的数据库在做数据订正时. 发现有部分数据重复的诡异现象. 本文将从规范出发.对 上 十进割0.1的二进制为0.0 0011 0011 0011…(据环0011) 十进制0.2的二进制为0.0011 0011 0011…(循环0011) 0.1 ? 0.2相加可衰示为: n bsp; n bsp;e = 4 m 二 1.10011001100. .1100 ( 52 位) n bsp;* e ? -3; m ? 1.10011001100. ..1100 ( 52 位) n bsp; n bsp;e - -3; m = 0.11001100110...0110 n bspr e = -3; m = 1.10011001100 ..1100 n bsp; n bsp:e ?3; m =10.01100110011 ...00 = = . 1 n bsp产 0 01001100110011.. 001 n bsp产 0.30000000000000004 (+ 进制) 根据上面的演算?还可以得出一个培论:当十避制小數的二进制駐示的有限数字不超过 52位时,在JavaScript里是可以精确存储的.比如: 0.05 ? 0.005 == 0.055 II true 进一歩的规律,比如, 0 05 * 0.2 == 0.25 // true 符号位取正.52位尾数全填充1,制如取最大値 971.S 然.答案依旧是Number.MAX_VALUE. 我们的问题究竟是什么虎?回到起始代码: 9999999999999999 == 10000000000000000; // true 很明S. 16个9还远远小干308个10.这个问通与MAX.VALUE没什么关系.还得归国到尾数 E只有52位上来. 可以用代码来描述: varx = 1;〃为了减少运算星,初始值可以设大一点,比如 Math.pow (2, 53)? 10 while (x!=x* 1) x //x = 9007199254740992 即 25 也就是说.当x小干等于25时.可以瞞保x的椅度不会丢失.当x大于25时.x 的精度有可能会丢失.比如: x为25 I时.其二进制衰示为: 10000000000...001 (中间共有 52 个 0) 用双II度浮点数存储时: e = 1;m = 10000. 00 (共 52 个 0.其中 1 是 hidden bit) 显A这和25的存储是一样的. 按照上面的思路可以推出.对于 25 ? 2.其二道制为100000?0010 (中间51个0). 也是可以精确存储的. 规律:当x大于25且二进制有效位效大于 53位时.就会存在相度丢失.这和小数 的精度丢失本质上是一样的. hidden bit 可参考:A tutorial about Java double type. 小話 小数和大整数的精度芸失,井不仅仅在JavaScript中存在.严格来说,使用了 IEEE 754 浮点数格式来存储浮点类型的任何编程语言( C/C**/C#/Java等等)都存在消度丢失问题. 在C#,Java中,提供了 Decimal. BigDedmal封装类来进行相应的处理.才避开了精度 丢失. 注:ECMAScript 规范中.巳有 nbsp;decimal proposal.但目前尚未核正式采纳. 曰 S5后考考大那, Number.MAX_V ALUE ? 1 == Numer.MAX_V ALUE; Number.MAX_V ALUE *2== Numer.MAX_V ALUE; Number.MAX.V ALUE ? x == Numer.MAX.V ALUE; Number MAX_V ALUE 1 = Infinrty; Number.MAX_V ALUE * Number.MAX_V ALUE == Infinity; 〃问题: //1.x的值是什么? // 2. Infinrty ? Number.MAX_V ALUE == x ? 1;是 true 还是 false ? 以上这爲浅淡JavaScript中小数和大整教的精度丢失就是小增分享给大家的全部内容 7.希望能给大宗一个参考

文档评论(0)

小光老师 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体赛罕区发光网络技术服务部
IP属地内蒙古
统一社会信用代码/组织机构代码
92150105MAC8HM2M1T

1亿VIP精品文档

相关文档