参考资料:
你知道 0.1+0.2 !==0.3是进制问题,但你讲不出个所以然,是吧?
用了一天时间,我终于彻底搞懂了 0.1+0.2 是否等于 0.3!

进制转换

二进制->十进制
a * 10^3 + b * 10^2 + c * 10^1 + d * 10^-1
十进制-> 二进制
整数部分:除二取余,从下往上读
小数部分:乘二取整,从上往下读
十进制浮点数转换二进制后尾数的 52 位 有效数字是从第一个 1 开始向后保留 52 位 有效数字,这个1不算在52位之内

数据存储

IEEE 754 中双精度浮点数使用 64 bit 来进行存储:

符号位:1位,表示正负号 0 正 1 负
指数位:2-12位,表示次方数
尾数位:13-64位,表示精确度

尾数位只有 52 位,但是我们现在在第一个 1 后面保留 52 位 有效数字,那再加上前面的 1 不就是 53 位 位了吗?
这是因为,尾数部分的整数部分一定是一个 1,那为了充分利用 52 位 空间表示更高的精确度,可以把一定等于 1 的整数部分省略,52 位 都用来表示小数。

浮点运算

  • JavaScript采用 IEEE 745 标准的浮点数运算,会产生舍入误差
  • 浮点数先转换为二进制,再运算

0.1 化为二进制:
0.000 11001100 11001100 11001100 11001100 11001100 11001100 1100 1100 11
0.1 保留52位有效数字:
0.000 11001100 11001100 11001100 11001100 11001100 11001100 1101 0

0.2 化为二进制:
0.00 11001100 11001100 11001100 11001100 11001100 11001100 1100 1100 11
0.2 保留52位有效数字:
0.00 11001100 11001100 11001100 11001100 11001100 11001100 1101 0

0.1+0.2:
0.000 11001100 11001100 11001100 11001100 11001100 11001100 1101 0
0.001 10011001 10011001 10011001 10011001 10011001 10011001 1010
——————————————————————————————————
0.0 10011001 10011001 10011001 10011001 10011001 10011001 1001 110
保留52位尾数
0.0 10011001 10011001 10011001 10011001 10011001 10011001 1010 0
转十进制
0.30000000000000004

JavaScript 浮点运算相关推荐

  1. 关于 JavaScript 浮点运算的精度解决方案

    问题背景 在 chrome 浏览器中调出开发者工具,在控制台窗口输入下面的表达式: 0.1 + 0.2 // 期望:0.3,结果:0.30000000000000004 这就是 JavaScript ...

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

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

  3. javascript小数相减会出现一长串的小数位数的原因

    javascript小数相减会出现一长串的小数位数的原因 <script> var a='38.8'; var b='6.8'; alert(parseFloat(a)-parseFloa ...

  4. jquery easyui 操作总结

    2019独角兽企业重金招聘Python工程师标准>>> src:http://lhdst-163-com.iteye.com/blog/1707232 1.dialog Java代码 ...

  5. JS浮点数运算Bug的解决办法(转自百度文库)

    37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)  我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998  怎么会这样,两个只 ...

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

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

  7. 由parseInt 引发的问题---想到浮点运算精度丢失---看透js number 的 encoded

    如题 先陈述下问题背景 偶尔测测自己写的计算器,随便输入玩嘛,然后发生下面诡异的事情: 当我从一个 1 输入到十个 1 的时候,过程显示都是正确的,像这样: 继续输入一个 1 的时候,然后就这个样子了 ...

  8. 在JavaScript中使用正好两位小数格式化数字

    我有这行代码将我的数字四舍五入到小数点后两位. 但是我得到这样的数字:10.8.2.4等.这些不是我对小数点后两位的想法,因此我如何改善以下内容? Math.round(price*Math.pow( ...

  9. Javascript中的陷阱大集合【译】

    参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...

  10. 《JavaScript高级程序设计 第3版》-学习笔记-1

    P1-P30页 1.<script>标签的属性 async:async(html)  | async="async"(xhtml),表示立即下载脚本,但不马上执行(执行 ...

最新文章

  1. Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
  2. linux中的nm命令
  3. 今天直播 | 融合媒体智能升级秘钥!
  4. 评估数据源是否回溯_IAI Trade:蒙特卡洛模拟在回溯检验中的应用
  5. SegmentFault Hackathon 文艺复兴
  6. ubuntu 安装fcitx输入法(3.6和4.0bate)
  7. 大数据从哪里来?| 技术头条
  8. 使用uiautomator2进行webview页面的测试
  9. preg_match进行正则表达式匹配
  10. Facebook正测试对话式的评论新界面
  11. The Bits(找规律)
  12. wordpress php 模板修改,教你如何修改wordpress模版技巧分享
  13. vc2012编译thrift
  14. ee er_英语单词说文解字—第32节 后缀er和ee的构词
  15. iOS 本地通知基本使用
  16. sklearn机器学习笔记:数据预处理与特征工程
  17. 常用数据库及默认端口
  18. SCRAPY爬虫实例
  19. python在线翻译小程序_Python爬虫学习之翻译小程序
  20. 免息贷款但有手续费的年化利率计算方法及Java实现;

热门文章

  1. 不动点求数列通项原理_【数列】浅谈“不动点”求数列通项的方法
  2. Springboot 整合Rabbit MQ
  3. B. Diverse Garland
  4. 如何将一张光盘制作成ISO镜像文件
  5. win10 hao123劫持html文件,Win10 edge浏览器主页被hao123劫持怎么解决?
  6. html制作钢铁侠心脏,钢铁侠胸部的“心脏”并非特效,那是怎么放进身体的?...
  7. Cisco 交换机的操作
  8. Win32基础学习笔记
  9. ESXi5安装vib格式驱动
  10. python f检验 模型拟合度_python 线性回归分析模型检验标准--拟合优度详解