JS中0.1+0.2!=0.3

2023-11-15

控制台打印测试:

console.log(0.1+0.2);//0.30000000000000004
  • 原因

1、存储原理

在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。
在JS中数字采用的IEEE 754的双精度标准进行存储(存储一个数值所使用的二进制位数比较多,精度更准确)

2、示例

在定点数中,如果我们以8位二进制来存储数字。
对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。
对于纯小数来说,十进制的0.375会被存储为: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375

对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011…由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。
JS中采用的IEEE 754的双精度标准也是一样的道理在存储空间有限的情况下,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。

console.log(0.1000000000000001) 
// 0.1000000000000001 (中间14个0,会打印除本身)
console.log(0.10000000000000001) 
// 0.1 (中间15个0,js会认为两个值足够近似,所以输出0.1)

由于0.1转换成二进制时是无限循环的,所以在计算机中0.1只能存储成一个近似值。另外说一句,除了那些能表示成 x/2^n 的数可以被精确表示以外,其余小数都是以近似值得方式存在的。

在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。 当然,也并非所有的近似值相加都得不到正确的结果。

3、解决办法

方式一: 想办法规避掉这类小数计算时的精度问题就好了,那么最常用的方法就是将浮点数转化成整数计算。因为整数都是可以精确表示的。

console.log((0.1*10+0.2*10)/10===0.3)

 

  • 方式二 : js的Number对象有一个保留小数位数的方法:toFixed();传入一个需要保留的位数就OK: 
 console.log(parseFloat((0.1+0.2).toFixed(5)))

 我们也测试一下Number() 和  parseInt

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS中0.1+0.2!=0.3 的相关文章

随机推荐

  • 【git】error: failed to push some refs to ‘https://github.com/biluko/ZJGSU-Exams-in-master-two.git‘

    我在提交代码的时候 遇到了下面的错误 To https github com biluko ZJGSU Exams in master two git rejected master gt master non fast forward e
  • webpack5从入门到精通

    前言 webpack是什么 摘自官网的一段话 webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具 当 webpack 处理应用程序时 它会在内部从一个或多个入口点构建一个 依赖图 dependency gra
  • IME SoftInputWindow窗口添加

    IME SoftInputWindow窗口添加 1 时序图 2 InputMethodService onCreate 3 Dialog添加到WMS android12 release1 1 时序图 输入法应用继承InputMethodSe
  • matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等

    matplotlib绘制图表 设置刻度标签 最大最小刻度 字体大小 label位置 刻度轴箭头等 1 效果图 2 源码 2 1 仅使用普通轴ax fontdict 源码 2 2 使用mpl设置全局字体 ax fontdict源码 写这篇博客
  • VUE知识(三)计算属性、监听属性、动画

    文章目录 一 计算属性 一 计算属性 computed 1 目标 2 语法 3 特点 4 注意 二 计算属性 缓存 1 目标 2 使用场景 3 优势 三 计算属性 完整写法 1 目标 2 语法 4 使用场景 二 监听属性 一 监听属性 wa
  • [LeetCode]栈,队列相关题目(C语言实现)

    文章目录 LeetCode20 有效的括号 LeetCode225 用队列实现栈 LeetCode232 用栈实现队列 LeetCode622 设计循环队列 LeetCode20 有效的括号 题目 给定一个只包括 的字符串 s 判断字符串是
  • 使用stream流对List<Map>分组求和

    使用stream流对List分组求和 public class Test2 public static void main String args List
  • linux 非root进程,Linux查看非root运行的进程

    Linux查看非root运行的进程 email protected ps U root u root N PID TTY TIME CMD 663 00 00 00 dbus daemon 713 00 00 00 rsyslogd 730
  • 性能优化:Excel导入10w数据

    需求说明 excel报表导出10w 数据 在我们的进出口贸易系统可能由于之前导入的数据量并不多没有对效率有过高的追求 但是到了二次开发版本 我预估导入时Excel 行数会是 10w 级别 而往数据库插入的数据量是大于 3n 的 也就是说 1
  • 5-2 有监督特征抽取

    文章目录 5 2 有监督特征抽取 基础知识 项目案例 动手练习 5 2 有监督特征抽取 请参考 数据准备和特征工程 中的相关章节 调试如下代码 基础知识 from sklearn datasets import make classific
  • 【绝㊙️】三年开发内功心得

    经典嵌套if else问题 这个也是老生常谈问题了 不管哪里都能看到 那如何解决 方法一 重要 如果逻辑分支过多 即使你不解决嵌套if slse 至少也要把每个 if的 里的逻辑抽到一个独立的方法或者工具类或者策略模式类 保证 里只有一行或
  • display:flex布局方式

    2009年 W3C提出了一种新的方案 Flex布局 可以简便 完整 响应式地实现各种页面布局 目前已得到所有现在浏览器的支持 Flex是Flexible Box的缩写 翻译成中文就是 弹性盒子 用来为盒装模型提供最大的灵活性 任何一个容器都
  • 元宇宙离我们有多远

    元宇宙离我们有多远 杨圆飞 202128015029001 No 145 元宇宙 Metaverse 即数字虚拟世界 电影 头号玩家 中的游戏 绿洲 黑客帝国 中的 矩阵 就是这样一个数字虚拟世界 因为这两个电影 人们对元宇宙有了具象化的认
  • JUC - 类汇总和学习指南

    一 概述 我们先来看下 JUC 的包括那些部分 Lock 框架和 Tools 类 把图中这两个放到一起理解 Collections 并发集合 Atomic 原子类 Executors 线程池 二 Lock 框架和 Tools 类 2 1 类
  • 解决org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:framework:compileDebugJav

    目录 介绍 解决方法1 解决方法2 解决方法3 解决方法4 解决方法5 解决方法6 解决方法7 介绍 今天在拉公司项目的时候报了一个奇怪的错误 在这里分享给大家 让大家少走弯路 报了这个错误信息其实有很多种可能性我依依把解决方案写在下面并且
  • 2022-12-18 网工进阶(三十八)MPLS LDP---LDP基础、工作原理(会话、标签的发布和管理、特性)、配置举例

    LDP概述 LDP是MPLS的一种控制协议 相当于传统网络中的信令协议 负责FEC的分类 标签的分配以及LSP的建立和维护等操作 LDP规定了标签分发过程中的各种消息以及相关处理过程 LDP的工作过程主要分为两部分 LSR之间建立LDP会话
  • PTA L2-034 口罩发放 (25 分)

    题目地址 L2 034 口罩发放 25 分 测试点 记录一下我遇到的坑 1 测试点4和测试点5的提交时间一样 卡排队顺序 2 有合法记录的 身体状况为 1 的申请人必须全部存下来 输出时再判重 不可以set直接存放判重 否则卡4 5 6测试
  • UDP的一对多通信(广播)

    补充 1 TCP通信采用一对一的通信模式 日常生活中的网络会议通知 广告 网络信息公告等功能 需要采用UDP实现一对多的群发功能 通过Internet实现群发功能的形式有两种 1 利用广播向子网中的所有客户发送消息 比如各类通知 单位公告
  • Day2-1 Maven工程、pom.xml工程管理、数据库连接和文件读写

    Maven工程 工具包 apache maven 3 5 4 bin tar gz 使用方法 解压后 在 conf settings xml文件配置镜像来源和本地存储目录等信息 并在STS关联 如下
  • JS中0.1+0.2!=0.3

    控制台打印测试 console log 0 1 0 2 0 30000000000000004 原因 1 存储原理 在计算机中数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的 在JS中数字采用的IEEE 754的双精度标准进行存储