资讯专栏INFORMATION COLUMN

javascript浮点数学习总结之0.1+0.2

neroneroffy / 2742人阅读

摘要:当阶码全位,尾数全为时,采取非规格化,两者不包含隐含的,用来表示。最简单的精度算法就是是位十进制,所以位肯定能精确处理。当然还有很多,有兴趣可以自行查阅一下。

掘金搬来思否
浮点数的存储格式:IEEE754-64bit 64位组成格式为:S(1位符号位) E(11位阶码)M(52位尾数)

符号位:决定正负,0位正,1位负

阶码:指数位则为阶码-1023,决定了数值的大小

尾数:有效数字,决定了精度

用科学计数法格式则为:(-1^(符号位0/1)) 1.xxxxx(尾数位) 2^(指数位)

需要记住的IEEE754规范有:

尾数位:有效数字的第一位必定是1,所以这个1不会被储存,也就是说实际上尾数位52+1,类似1.xxx第一位就是1。

阶码:不存在负值,那怎么表示负指数呢?就是减去一个固定值;其值就是1023,也就是偏移量1023;除去全是1和全是0的情况,那么指数位的范围则是[(1-1023),(2046-1023)] == [-1022,1023]。

当阶码全位0,尾数全为0时,采取非规格化,两者不包含隐含的1,用来表示0。

最简单的精度算法就是:2^53是16位十进制,所以15位肯定能精确处理。

当然还有很多,有兴趣可以自行查阅一下。

知道了这些,就能更好的理解一些数值的由来:
Number.MAX_VALUE = 1.7976931348623157e+308;
尾数:1.xxx1,后面为52个1,
要得到最大值,我们就需要把小数点往后移,就靠指数1023-52,剩余971;  
因此最大值等价于((Math.pow(2,53)-1)*Math.pow(2,971))
Number.MIN_VALUE =5e-324;  
尾数:1.xxxx1,后面第52位为1,其余为0,这时首位的1需要隐藏,
这时候就是负了52位,在加上2^-1022,
等价于((Math.pow(2,-52))*Math.pow(2,-1022))
Number.MAX_SAFE_INTEGER = 9007199254740991;
安全数就是能够精确处理的,精度靠尾数决定,
那我们来看当1.1111...1,小数点后接52个1,这是精度最大显示,
要取其最大值那就是向指数借52位,所以最大安全数就等于Math.pow(2,53)-1

同理Number.MIN_SAFE_INTEGER = -9007199254740991;
对最大安全数添加负号即可
重点0.1 + 0.2 怎么计算的呢?
首先,0.1转二进制 :0.0 001100110011001100110011..0011 0011,
改写为科学计数法表示:1.100110011...0011(0011)*2^-4,
尾数位为52为需要取舍括号中最后一位舍去进1,指数为-4,那个阶码就是-4+1023=1019,
最终浮点数格式:
0-01111111011-1001100110011001100110011001100110011001100110011010
同理0.2可以表示为:
0-01111111100-1001100110011001100110011001100110011001100110011010
最后两者相加结果为:
0-01111111101-0011001100110011001100110011001100110011001100110100,
指数位为-2,
1.00110011001100110011001100110011001100110011001101(00)*2^-2
所以二进制表示:
0.0100110011001100110011001100110011001100110011001101(00),
那么转为十进制就是0.1 + 0.2 = 0.30000000000000004 != 0.3 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97939.html

相关文章

  • JavaScript浮点运算0.2+0.1 !== 0.3

    摘要:标准二进制浮点数算法就是一个对实数进行计算机编码的标准。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。 浮点运算JavaScript 本文主要讨论JavaScript的浮点运算,主要包括 JavaScript number基本类型 二进制表示十进制 浮点数的精度 number 数字类型 在JavaScript中,数字只有numb...

    iflove 评论0 收藏0
  • 为什么0.1+0.2不等于0.3

    摘要:又如,对于,结果其实并不是,但是最接近真实结果的数,比其它任何浮点数都更接近。许多语言也就直接显示结果为了,而不展示一个浮点数的真实结果了。小结本文主要介绍了浮点数计算问题,简单回答了为什么以及怎么办两个问题为什么不等于。 原文地址:为什么0.1+0.2不等于0.3 先看两个简单但诡异的代码: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...

    Profeel 评论0 收藏0
  • JS

    摘要:由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。根据标准,位浮点数的指数部分的长度是个二进制位,意味着指数部分的最大值是的次方减。也就是说,位浮点数的指数部分的值最大为。 一 前言 这篇文章主要解决以下三个问题: 问题1:浮点数计算精确度的问题 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...

    williamwen1986 评论0 收藏0
  • 为什么JavaScript里面0.1+0.2 === 0.3是false

    摘要:返回是,这是为什么呢我们知道浮点数计算是不精确的,上面的返回式实际上是这样的在的新规范加入了一个新的东西是在对象上面,新增一个极小的常量。根据规格,它表示与大于的最小浮点数之间的差。上面的代码为浮点数运算,部署了一个误差检查函数。 0.1+0.2 === 0.3 //返回是false, 这是为什么呢?? 我们知道浮点数计算是不精确的,上面的返回式实际上是这样的:0.1 + 0.2 = ...

    nicercode 评论0 收藏0
  • javascript0.1 + 0.2 != 0.3?

    摘要:按照的数字格式,整数有的范围是,而且只能表示有限个浮点数,能表示的个数为个。 0.1+0.2 等于0.3吗?相信拿着这条题目随便问一个高年级的小学生,他们都会毫不犹豫都回答:相等。是的,相等是正常的,这是常识。但是都说实践是检验真理的唯一标准,拿这道简单的算术题用javascript在chrome控制台试验一下: 结果令人大跌眼镜,在控制台输入0.1+0.2 == 0.3返回的结果竟然...

    ivydom 评论0 收藏0

发表评论

0条评论

neroneroffy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<