解析js中0.1 + 0.2 != 0.3

javascript中数字存储使用的是ieee754 64位双精度浮点数

在计算机中存储为64位
1 11 52
1: 符号位 0正数 1负数
11: 指数位 用来确定范围
52: 尾数位 用来确定精度
转成十进制表示法为

num = (-1)^s * (1.f) * 2^EE = e - 1023s:符号位e:指数位f:尾数位1023偏正值 使得指数位真实取值为[-1023, 1024] 而非 [0, 2047] 目的是为了方便比较大小实际指数值 = 阶码 - 偏正值阶码 = 指数的移码 - 1移码与补码符号为互为取反举例:如果指数位实际值为-1原码:100 0000 0001反码:111 1111 1110补码:111 1111 1111移码:011 1111 1111阶码:011 1111 1110 = 1022也可以通过阶码 = 指数 + 偏正值 = -1 + 1023 = 1022 = 011 1111 1110来计算得到

登录后复制

指数位全0和全1有特殊含义,在后面会讲到,用来表示+-0 和 +-∞

特殊值

解析js中0.1 + 0.2 != 0.3

机器精度
del = 2^-52

接下来解释一下为什么在使用IEEE754标准的语言中0.1 + 0.2 = 0.30000000000000004
首先我们计算下0.1的二进制
0.1 * 2 = 0
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
….
所以0.1的二进制为 0.0001100110011001100…循环,
可以转换为2^-4 * 1.100110011001100…
由于保留位数共52位,不包括最左边整数位1,
所以最终在计算机中存储的数值是:2^-4 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 1

同理0.2
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1
0.2 * 2 = 0
0.4 * 2 = 0
0.8 * 2 = 1
0.6 * 2 = 1

所以0.2的二进制为 0.001100110011001100…循环,
可以转换为2^-3 * 1.100110011001100…
最易最终在计算机中存储的数值是:2^-3 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 1
两者相加
0.0001100 11001100 11001100 11001100 11001100 11001100 11001100 1
+
0.001100 11001100 11001100 11001100 11001100 11001100 11001100 1
= 0.0 10011001 10011001 10011001 10011001 10011001 10011001 10011
≈ 0.30000000000000004

以上就是解析js中0.1 + 0.2 != 0.3的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786160.html

(0)
上一篇 2025年3月8日 17:40:28
下一篇 2025年3月8日 17:40:35

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • angularjs利用$http异步上传Excel文件方法分享

    本文主要和大家分享angularjs利用$http异步上传excel文件方法,希望能帮助到大家。 1.文件上传框html代码如下 上传文件 登录后复制 *注意: 设置form的enctype属性值为:multipart/form-data …

    编程技术 2025年3月8日
    200
  • JavaScript闭包基础

    什么是闭包?本文主要和大家分享javascript闭包基础,包括javascript闭包定义和用法,希望能帮助到大家。 书上是这样定义闭包的: 有权访问另一个函数作用域中变量的函数。 举一个例子: function test(){ var …

    2025年3月8日
    200
  • js桥接设计模式详解

     桥接设计模式是许多其他设计模式的基础,比如装饰模式, 代理模式都或多或少看到他的影子, 在面向对象设计中最重要的一个特点就是继承, 然而作为拓展类的功能的方式有两种 — 继承和桥接, 桥接用我简单的理解就是放弃使用继承的方式拓…

    编程技术 2025年3月8日
    200
  • Node.JS搭建简易版json服务

    node.js对于追逐全栈开发的小伙伴们自然不陌生。他是建立与chrome v8引擎下的高性能,异步io、事件驱动javascript语言,使编写高性能web服务轻而易举。今天要分享的是一个使用node.js逐步推演建立一个完善的json服…

    2025年3月8日 编程技术
    200
  • 原生JS实现Tab选项卡各种效果

    前一段时间我写了几篇关于css属性的理解和用法方面的文章,今天就不分享css属性了,给大家分享一个我们在实际工作中用到比较多的一个效果——tab选项卡效果。首先,我们先来看看tab选项卡效果是什么样子,以qq新闻为例,有如下效果: 当鼠标滑…

    2025年3月8日 编程技术
    200
  • js组合设计模式详解

    组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与…

    2025年3月8日
    200
  • JavaScript和Python 的数组去重解析

    “数组去重” 是实际应用中常用的操作,出现在面试题中的概率也很高,今天简述一下 python 和 javascript 中数组去重的方法,希望能帮助到大家。 python数组去重 >>> a = […

    2025年3月8日
    200
  • js控制文件拖拽及获取拖拽内容

    在用户拖拽文件到浏览器的某个元素上时,js可以监听到与拖拽相关的事件,并对拖拽结果进行处理,本文讨论下和拖拽文件相关的一些问题,不过没有处理太多关于兼容性的问题。 拖拽事件 js能够监听到拖拽的事件有drag、dragend、dragent…

    编程技术 2025年3月8日
    200
  • JS常用设计模式

    大型单页应用里,复杂度上升到一定程度时,没有适当的设计模式进行降耦,后续的开发也难以下手。而设计模式正是为了降耦而存在。 单例模式 单例模式的核心是确保只有一个实例,并且提供全局访问。 特点 满足“单一职责原则” : 使用代理模式,不在构造…

    编程技术 2025年3月8日
    200
  • javascript数据结构与算法详解

    请实现一个函数,输入一个整数,输出该数二进制表示1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。首先对于二进制1的求解,在这里,我们最应该想到的就是关于位运算的一些操作符。总共有五种运算,分别是:与(&a…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论