欢迎来到天天文库
浏览记录
ID:30517342
大小:17.43 KB
页数:6页
时间:2018-12-31
《浅谈javascript中小数和大整数的精度丢失》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解浅谈JavaScript中小数和大整数的精度丢失 下面小编就为大家带来一篇浅谈JavaScript中小数和大整数的精度丢失。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。 先来看两个问题: 0.1+0.2==0.3;//false 99999==;//true 第一个问题是小数的精度问题,在业界不少博客里已有讨论。第二个问题,去年公司有个系统的数据库在做数据订正时,发现有部分数据重复的诡异现象。本文将从规范出发,
2、对上面的问题做个小结。 最大整数 JavaScript中的数字是用IEEE754双精度64位浮点数来存储的,其格式为: sxmx2^e s是符号位,表示正负。m是尾数,有52bits.e是指数,有11bits.在ECMAScript规范里有给出e的范围为[-1074,971].这样,很容易推导出JavaScript能表示的最大整数为: 1x(2^53-1)x2^971=1.23157e+308 这个值正是Number.MAX_VALUE对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实
3、代表我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解 同理可推导出Number.MIN_VALUE的值为: 1x1x2^(-1074)=5e-324 注意MIN_VALUE表示最接近0的正数,而不是最小的数。最小的数是-Number.MAX_VALUE 小数的精度丢失 JavaScript的数字都是双精度浮点数,在计算机里用二进制存储。当有效位数超过52位时,会存在精度丢失。比如: 十进制0.1的二进制为0.0001100110011…(循环0011) 十进制0.
4、2的二进制为0.001100110011…(循环0011) 0.1+0.2相加可表示为: e=-4;m=1....1100(52位) +e=-3;m=1....1100(52位) --------------------------------------------- e=-3;m=0....0110 +e=-3;m=1....1100 --------------------------------------------- e=-3;m=10....001 ------------------------------------
5、--------- =0.011...001对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解 =0.(十进制) 根据上面的演算,还可以得出一个结论:当十进制小数的二进制表示的有限数字不超过52位时,在JavaScript里是可以精确存储的。比如: 0.05+0.005==0.055//true 进一步的规律,比如: 0.05+0.2==0
6、.25//true 0.05+0.9==0.95//false 需要考虑IEEE754的Roundingmodes,有兴趣的可进一步研究。 大整数的精度丢失 这个问题鲜有人提及。首先得弄清楚问题是什么: 1.JavaScript能存储的最大整数是什么? 该问题前面已回答,是Number.MAX_VALUE,非常大的一个数。 2.JavaScript能存储的且不丢失精度的最大整数是什么? 根据sxmx2^e,符号位取正,52位尾数全填充1,指数e取最大值971,显然,答案依旧是Number.MAX_VALUE. 我们的问题究竟是什么呢?回到起始代码:
7、 99999==;//true对党的认识也有了进一步的提高。才真正体会到了中国共产党的伟大、光荣和正确,更感到只有中国共产党是全中国最广大人民利益的忠实代表我真正系统地接触和学习党的基本知识是在这次中级党校的培训班上。通过学习,了解了党的发展历程,对党的性质、宗旨、任务等基本知识有了进一步的了解 很明显,16个9还远远小于308个10.这个问题与MAX_VALUE没什么关系,还得归属到尾数m只有52位上来。 可以用代码来描述: varx=1;//为了减少运算量,初始值可以设大一点,比如Math.pow(2,53)-10 while(x!=x+
此文档下载收益归作者所有