JavaScript-浮点数陷阱及其解法浅析.doc

JavaScript-浮点数陷阱及其解法浅析.doc

ID:57695505

大小:251.00 KB

页数:9页

时间:2020-09-01

JavaScript-浮点数陷阱及其解法浅析.doc_第1页
JavaScript-浮点数陷阱及其解法浅析.doc_第2页
JavaScript-浮点数陷阱及其解法浅析.doc_第3页
JavaScript-浮点数陷阱及其解法浅析.doc_第4页
JavaScript-浮点数陷阱及其解法浅析.doc_第5页
资源描述:

《JavaScript-浮点数陷阱及其解法浅析.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、几乎所有的高级程序员都会js,而web前端攻城狮(只)会js,但是确已经足够在互联网it行业中立足,JavaScript浮点数在运算时经常会碰到0.000000001和0.999999999这种情况,如0.1+0.2=0.30000000000000004、1-0.9=0.09999999999999998,很多攻城狮都知道这是浮点误差所造成的,那么如何解决这些问题呢?跟着老师一起来学习一下。JavaScript浮点数陷阱及解法浮点数的存储首先要搞清楚JavaScript如何存储小数。和其它语言如Java和Pyth

2、on不同,JavaScript中所有数字包括整数和小数都只有一种类型—Number。它的实现遵循IEEE754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数(相关的还有float32位单精度)。计算机组成原理中有过详细介绍,如果你不记得也没关系。这样的存储结构优点是可以归一化处理整数和小数,节省存储空间。64位比特又可分为三个部分:§符号位S:第1位是正负数符号位(sign),0代表正数,1代表负数§§指数位E:中间的11位存储指数(exponent),用来表示次方数§§尾数位M:最后的52位

3、是尾数(mantissa),超出的部分自动进一舍零§64bitallocation实际数字就可以用以下公式来计算:$V=(-1)^{S}imesMimes2^{E}$注意以上的公式遵循科学计数法的规范,在十进制是为0

4、个中间数1023,[0,1022]表示为负,[1024,2047]表示为正。如4.5的指数E=1025,尾数M为001。最终的公式变成:$V=(-1)^{S}imes(M+1)imes2^{E-1023}$所以4.5最终表示为(M=001、E=1025):4.5allocationmap下面再以0.1例解释浮点误差的原因,0.1转成二进制表示为0.0001100110011001100(1100循环),1.100110011001100x2^-4,所以E=-4+1023=1019;M舍去首位的1,得到1001100

5、11...。最终就是:0.1allocationmap转化成十进制后为0.100000000000000005551115123126,因此就出现了浮点误差。为什么0.1+0.2=0.30000000000000004?计算步骤为://0.1和0.2都转化成二进制后再进行运算0.00011001100110011001100110011001100110011001100110011010+0.0011001100110011001100110011001100110011001100110011010=0.010

6、0110011001100110011001100110011001100110011001100111//转成十进制正好是0.30000000000000004为什么x=0.1能得到0.1?恭喜你到了看山不是山的境界。因为mantissa固定长度是52位,再加上省略的一位,最多可以表示的数是2^53=9007199254740992,对应科学计数尾数是9.007199254740992,这也是JS最多能表示的精度。它的长度是16,所以可以使用toPrecision(16)来做精度运算,超过的精度会自动做凑整处理。

7、于是就有:0.10000000000000000555.toPrecision(16)//返回0.1000000000000000,去掉末尾的零后正好为0.1//但你看到的`0.1`实际上并不是`0.1`。不信你可用更高的精度试试:0.1.toPrecision(21)=0.100000000000000005551大数危机可能你已经隐约感觉到了,如果整数大于9007199254740992会出现什么情况呢?由于M最大值是1023,所以最大可以表示的整数是2^1024-1。这就是能表示的最大整数。但你并不能这样计算

8、这个数字,因为从2^1024开始就变成了Infinity>Math.pow(2,1023)8.98846567431158e+307>Math.pow(2,1024)Infinity那么对于(2^53,2^63)之间的数会出现什么情况呢?(2^53,2^54)之间的数会两个选一个,只能精确表示偶数(2^54,2^55)之间的数会四个选一个,只能精确表示4个倍

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。