蚂蚁文库
换一换
首页 蚂蚁文库 > 资源分类 > DOC文档下载
 

关于javascript计算精度丢失的问题.doc

  • 资源ID:619400       资源大小:93.50KB        全文页数:15页
  • 资源格式: DOC        下载权限:游客/注册会员    下载费用:10积分 【人民币10元】
快捷注册下载 游客一键下载
会员登录下载
三方登录下载: 微信快捷登录 QQ登录  
下载资源需要10积分 【人民币10元】
邮箱/手机:
温馨提示:
支付成功后,系统会自动生成账号(用户名和密码都是您填写的邮箱或者手机号),方便下次登录下载和查询订单;
支付方式: 微信支付    支付宝   
验证码:   换一换

 
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,既可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰   

关于javascript计算精度丢失的问题.doc

关于JAVASCRIPT中计算精度丢失的问题关于JAVASCRIPT中计算精度丢失的问题摘要由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JAVASCRIPT中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失。为了避免产生精度差异,把需要计算的数字升级(乘以10的N次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的N次幂),这是大部分编程语言处理精度差异的通用方法。关键词计算精度四舍五入四则运算精度丢失1疑惑我们知道,几乎每种编程语言都提供了适合货币计算的类。例如C提供了DECIMAL,JAVA提供了BIGDECIMAL,JAVASCRIPT提供了NUMBER由于之前用DECIMAL和BIGDECIMAL用得很好,没有产生过精度问题,所以一直没有怀疑过JAVASCRIPT的NUMBER类型,以为可以直接使用NUMBER类型进行计算。但是直接使用是有问题的。我们先看看四舍五入的如下代码ALERTNUMBER0009TOFIXED2ALERTNUMBER162295TOFIXED2按正常结果,应该分别弹出001和16230。但实际测试结果却是在不同浏览器中得到的是不同的结果在IE6、7、8下得到000和16230,第一个数截取不正确;在FIREFOX中得到001和16229,第二个数截取不正确;在OPERA下得到001和16229,第二个数截取不正确我们再来看看四则运算的代码ALERT1/3//弹出03333333333333333ALERT0102//弹出030000000000000004ALERT009001//弹出009999999999999999ALERT00123450000001//弹出12344999999999999E8ALERT0000001/00001//弹出0009999999999999998关于JAVASCRIPT中计算精度丢失的问题按正常结果,除第一行外因为其本身就不能除尽,其他都应该要得到精确的结果,从弹出的结果我们却发现不是我们想要的正确结果。是因为没有转换成NUMBER类型吗我们转换成NUMBER后再计算看看ALERTNUMBER1/NUMBER3//弹出03333333333333333ALERTNUMBER01NUMBER02//弹出030000000000000004ALERTNUMBER009–NUMBER001//弹出009999999999999999ALERTNUMBER0012345NUMBER0000001//弹出12344999999999999E8ALERTNUMBER0000001/NUMBER00001//弹出0009999999999999998还是一样的结果,看来JAVASCRIPT默认把数字识别为NUMBER类型。为了验证这一点,我们用TYPEOF弹出类型看看ALERTTYPEOF1//弹出NUMBERALERTTYPEOF1/3//弹出NUMBERALERTTYPEOF009999999//弹出NUMBER2原因为什么会产生这种精度丢失的问题呢是JAVASCRIPT语言的BUG吗我们回忆一下大学时学过的计算机原理,计算机执行的是二进制算术,当十进制数不能准确转换为二进制数时,这种精度误差就在所难免。再查查JAVASCRIPT的相关资料,我们知道JAVASCRIPT中的数字都是用浮点数表示的,并规定使用IEEE754标准的双精度浮点数表示IEEE754规定了两种基本浮点格式单精度和双精度。IEEE单精度格式具有24位有效数字精度包含符号号,并总共占用32位。IEEE双精度格式具有53位有效数字精度包含符号号,并总共占用64位。这种结构是一种科学表示法,用符号(正或负)、指数和尾数来表示,底数被确定为2,也就是说是把一个浮点数表示为尾数乘以2的指数次方再加上符号。下面来看一下具体的规格符号位指数位小数部分指数偏移量单精度浮点数1位(31)8位(3023)23位(2200)127双精度浮点数1位(63)11位(6252位(511023关于JAVASCRIPT中计算精度丢失的问题52)00)我们以单精度浮点数来说明指数是8位,可表达的范围是0到255而对应的实际的指数是-127到+128这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的-127表示的数字是0128和其他位数组合表示多种意义,最典型的就是NAN状态。知道了这些,我们来模拟计算机的进制转换的计算,就找一个简单的0102来推演吧十进制01二进制000011001100110011循环0011尾数为110011001100110011001100(共52位,除了小数点左边的1),指数为4(二进制移码为00000000010),符号位为0计算机存储为0000000001001001100110011001111001因为尾数最多52位,所以实际存储的值为000011001100110011001100110011001100110011001100110011001而十进制02二进制00011001100110011循环0011尾数为110011001100110011001100(共52位,除了小数点左边的1),指数为3(二进制移码为00000000011),符号位为0存储为0000000000111001100110011001111001因为尾数最多52位,所以实际存储的值为000110011001100110011001100110011001100110011001100110011那么两者相加得000011001100110011001100110011001100110011001100110011001000110011001100110011001100110011001100110011001100110011001001100110011001100110011001100110011001100110011001100转换成10进制之后得到030000000000000004从上述的推演过程我们知道,这种误差是难免的,C的DECIMAL和JAVA的BIGDECIMAL之所以没有出现精度差异,只是因为在其内部作了相应处理,把这种精度差异给屏蔽掉了,而JAVASCRIPT是一种弱类型的脚本语言,本身并没有对计算精度做相应的处理,这就需要我们另外想办法处理了。关于JAVASCRIPT中计算精度丢失的问题3解决办法31升级降级从上文我们已经知道,JAVASCRIPT中产生精度差异的原因是计算机无法精确表示浮点数,连自身都不能精确,运算起来就更加得不到精确的结果了。那么怎么让计算机精确认识要计算的数呢我们知道十进制的整数和二进制是可以互相进行精确转换的,那么我们把浮点数升级(乘以10的N次幂)成计算机能够精确识别的整数来计算,计算完毕之后再降级(除以10的N次幂),不就得到精确的结果了吗对,就这么办我们知道,MATHPOW10,SCALE可以得到10的SCALE次方,那么就把浮点数直接乘以MATHPOW10,SCALE就可以了吗我最初就是这么想的,但后来却发现一些数字运算后实际结果与我们的猜想

注意事项

本文(关于javascript计算精度丢失的问题.doc)为本站会员(马老师)主动上传,蚂蚁文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知蚂蚁文库(发送邮件至2303240369@qq.com或直接QQ联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们


网站客服QQ:2303240369

copyright@ 2017-2027 mayiwenku.com 

网站版权所有  智慧蚂蚁网络

经营许可证号:ICP备2024020385号



收起
展开