博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript浮点数学习总结之0.1+0.2
阅读量:7210 次
发布时间:2019-06-29

本文共 1592 字,大约阅读时间需要 5 分钟。

浮点数的存储格式: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://juejin.im/post/5b9f1fb8f265da0aec224d87

你可能感兴趣的文章
GNU的ar,ranlib和nm
查看>>
《Linux内核设计与实现》读书笔记(十九)- 可移植性
查看>>
都是假期惹的祸,该如何安慰自己?
查看>>
从零开始学JavaScript二(基本概念)
查看>>
Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
查看>>
js中的var
查看>>
年终知识分享——移动应用开发
查看>>
Centos 5.5 安装Mysql5.5过程
查看>>
网络爬虫基本原理(二)
查看>>
AndroidUI组件之ListView小技巧
查看>>
使用ThinkPHP框架高速开发站点(多图)
查看>>
解决iframe缓存
查看>>
mysql事物
查看>>
微软开源代码
查看>>
ssh 实体关系分析确立(ER图-实体关系图)
查看>>
shell语法简单介绍
查看>>
iOS捕获异常,常用的异常处理方法
查看>>
Struts2(九)OGNL标签一与Struts2标签
查看>>
双网卡绑定-bond0
查看>>
利用扩展事件进行调优和Troubleshooting PPT分享
查看>>