浮点数的存储格式: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

javascript浮点数学习总结之0.1+0.2相关推荐

  1. 谈 JavaScript 浮点数计算精度问题(如0.1+0.2!==0.3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...

  2. 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)

    不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在 精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.6000000000 ...

  3. verilog 浮点转定点_浮点数0.1+0.2为何不等于0.3

    来自公众号:印记中文 本文由扇贝的前端工程师景国凯撰写,跟随作者一起了解浮点数的计算过程,掌握为何会出现精度丢失的根本原因. 之前简单介绍了二进制下整数的加减乘除基本运算,建议没看过的先去了解一下,这 ...

  4. 如何解决JavaScript中0.1+0.2不等于0.3

    原文转载自:https://www.cnblogs.com/weshare/archive/2018/02/20/8455470.html >console.log(0.1+0.2===0.3) ...

  5. lua 从一串数字中取出偶数位的数字_为什么JavaScript中 0.1 0.2 不等于0.3?

    在 js 中进行数学的运算时,会出现0.1+0.2=0.300000000000000004的结果,一开始认为是浮点数的二进制存储导致的精度问题,但这似乎不能很好的解释为什么在同样的存储方式下0.3+ ...

  6. JavaScript浮点运算0.2+0.1 !== 0.3

    浮点运算JavaScript 本文主要讨论JavaScript的浮点运算,主要包括 JavaScript number基本类型 二进制表示十进制 浮点数的精度 number 数字类型 在JavaScr ...

  7. PHP (20140510)深入浅出 JavaScript 变量、作用域和内存 v 0.5

    深入浅出 JavaScript 变量.作用域和内存 v 0.5 本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理. 主要参考<JS高级程序设计& ...

  8. 编程学习应用 Growth 发布 3.0,在碎片时间里练习

    Growth 1.0~2.0 已经有 2101 次提交,而 Growth 3.0 则已经拥有了 900+ 提交.这意味着 Growth 整个项目有多达 3000 次提交,感谢每一个为 Growth 项 ...

  9. 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通

    尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通 1.Vue核心部分 1.1 Vue简介 1.1.1 Vue是什么? Vue是一套用于构建用户界面的渐进式JavaScript框架. ...

最新文章

  1. Git 2.25.0发布,支持部分clone、稀疏checkout
  2. 林宙辰:实现机器学习科研从 0 到 1,没有什么比一个好的理论更加实用
  3. 了解机器学习回归的3种最常见的损失函数
  4. python程序只能使用源代码进行运行吗-python在运行时更改源代码
  5. 如何搭建modem编译环境
  6. 12款优秀的 JavaScript 日历和时间选择控件
  7. [BUUCTF-pwn]——axb_2019_fmt32
  8. 点击回应、关闭确认以及另一种获取设备环境句柄的方法
  9. Postman发送请求时带上登录信息
  10. LeetCode 347. 前 K 个高频元素(哈希/优先队列)
  11. 简易 Vue 构建--篇三
  12. elt和etl_ETL和ELT架构概述
  13. 易筋SpringBoot 2.1 | 第廿八篇:SpringBoot之循环引用Circular Dependency
  14. 制作一个html文件 效果如下图,PSD网页切图制作HTML教程1
  15. QT学习笔记——06-Day15_C++_QT
  16. 小米路由器青春版(R1CL)刷高恪软路由系统
  17. 信使广告终结者 绿色
  18. oracle expdp parallel,关于EXPDP中的PARALLEL参数
  19. RoboMaster视觉笔记CMake(六) Compile Flags
  20. csv、txt和tsv数据文件的异同点,以及如何使用Python读取和生成

热门文章

  1. Ajax--同源策略,jsonp跨域传输原理(callback),
  2. VS2015新建项目无法选择framework 4.6.2
  3. Struts2中UI标签之非表单标签
  4. Linux查找class类所在jar包
  5. Ranger-Kylin插件安装
  6. HBase中的MemStore
  7. slf4j+logback 日志
  8. excel重复上一步快捷键_工作再忙也要学会的十个Excel快捷键
  9. 第十七届“科大讯飞杯”高校网络友谊赛——F-排列计算
  10. 睡前小故事之MySQL起源