70、在js中为什么0.1+0.2不等于0.3

2023-05-16

并不是所有小数都可以用「完整」的二进制来表示的,比如十进制 0.1 在转换成二进制小数的时候,是一串无限循环的二进制数,计算机是无法表达无限循环的二进制数的,毕竟计算机的资源是有限。因此,计算机只能用「近似值」来表示该二进制,那么意味着计算机存放的小数可能不是一个真实值。

原因:JS中采用的IEEE 754的(64位)双精度标准,计算机内部存储数据的编码的时候,0.1在计算机内部根本就不是精确的0.1,而是一个有舍入误差的0.1。当代码被编译或解释后,0.1已经被四舍五入成一个与之很接近的计算机内部数字,以至于计算还没开始,一个很小的舍入错误就已经产生了。这也就是 0.1 + 0.2 不等于0.3 的原因。

方法一:toFixed() 进行转换之后是string类型的,需要再进行强制转换

parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true

NumberObject.toFixed(num) 方法:指定NumberObject 四舍五入为 小数位数为num 的数字。

注意:toFixed 在IE10及以上里面是正常的四舍五入;但是别的浏览器里,它不是正常的四舍五入,采用四舍六入五成双。即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数) 。

问题:但是在chorme(最新版),并没有完全遵守四舍六入五成双这个规则。(四舍五入有误,但不影响上述方法的结果,仍是0.3)

var a = 1.335;
console.log(a.toFixed(2))
// IE         1.34
//chorme   1.33

方法二: 可以通过引入 math.js 或者 bigNumber.js 进行解决

new BigNumber(0.2).plus(0.1).toString() // '0.3'
new BigNumber(19.9).plus(0.01).toNumber() // 19.91

方法三:分别先乘10的倍数,然后再除10

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

更易懂的解释:

面试官:在JS中为什么0.2+0.1>0.3?⭐⭐⭐⭐

答:

因为在JS中,浮点数是使用64位固定长度来表示的,其中的1位表示符号位,11位用来表示指数位,剩下的52位尾数位,由于只有52位表示尾数位

0.1转为二进制是一个无限循环数0.0001100110011001100......(1100循环)

由于只能存储52位尾数位,所以会出现精度缺失,把它存到内存中再取出来转换成十进制就不是原来的0.1了,就变成了0.100000000000000005551115123126,而为什么02+0.1是因为

// 0.1 和 0.2 都转化成二进制后再进行运算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

// 转成十进制正好是 0.30000000000000004

面试官:那为什么0.2+0.3=0.5呢?⭐⭐⭐⭐

// 0.2 和 0.3 都转化为二进制后再进行计算
0.001100110011001100110011001100110011001100110011001101 +
0.0100110011001100110011001100110011001100110011001101 = 
0.10000000000000000000000000000000000000000000000000001 //尾数为大于52位

// 而实际取值只取52位尾数位,就变成了
0.1000000000000000000000000000000000000000000000000000   //0.5

答:0.2 和0.3分别转换为二进制进行计算:在内存中,它们的尾数位都是等于52位的,而他们相加必定大于52位,而他们相加又恰巧前52位尾数都是0,截取后恰好是0.1000000000000000000000000000000000000000000000000000也就是0.5

面试官:那既然0.1不是0.1了,为什么在console.log(0.1)的时候还是0.1呢?⭐⭐⭐

答:console.log的时候会二进制转换为十进制,十进制再会转为字符串的形式,在转换的过程中发生了取近似值,所以打印出来的是一个近似值的字符串

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

70、在js中为什么0.1+0.2不等于0.3 的相关文章

  • 爬虫常见错误以及难点(一)

    目录 常见错误一 常见错误二 常见错误三 常见错误四 难点 xff1a 难点一 难点二 难点三 难点四 难点五 难点六 难点七 难点八 难点九 难点十 难点十一 难点十二 难点十三 难点十四 难点十五 难点十六 常见错误一 就是设置 hea
  • Linux下开启和禁用触摸板-转

    本文转自 xff1a https blog csdn net junmuzi article details 38491093 感谢原作者分享 电脑型号 xff1a DELL G3 操作系统 xff1a Linux 16 04 LTS 打开
  • function declared implicitly的正确解决方法

    使用GUIBuilder创建了两个 c文件 xff0c 需要在其中一个文件中调用另一个文件的函数 xff0c 他们初始只有 include DIALOG h xff0c 在编译只有一个警告 xff0c declared implicitly
  • Jetson TX2物理引脚与虚拟引脚映射计算

    Data 2017 11 17 Author cjh Theme Jetson TX2物理引脚与虚拟引脚映射计算 最近需要控制Jetson TX2 J21那一排的引脚 xff0c 发现其规律和TX2相距甚远 xff0c 网上NVIDIA的论
  • SVN

    转自 http blog csdn net gexiaobaohelloworld article details 7752862 SVN简介 SVN xff08 Subversion xff09 是一个自由 开源的项目源代码版本控制工具
  • svn使用的适用技巧

    关于SVN的使用 xff0c 这里整理两个重要的问题 xff1a 1 svn不能commit so 2 34 a 34 等库文件 xff1a svn add 还是 svn st 均查看不到想要提交的 so 文件 后来才知道原来是配置文件出了
  • calico更换ip地址池-k8s

    注意 xff1a 生产环境更换ip地址池会导致网络中断 xff0c 请慎重 在Kubernetes中 xff0c 以下所有三个参数必须等于或包含Calico IP池CIDR xff1a kube apiserver xff1a pod ne
  • Centos 7安装GNOME桌面环境

    第一步 xff1a 列出可安装的桌面环境 span class token punctuation span root 64 local span class token punctuation span span class token
  • Linux anaconda3 安装python版zeroc-ice 3.7.3报 undefined symbol: SSLeay

    原因 xff1a linux通过 pip install zeroc ice 61 61 3 7 3时会从源文件重新编译一个二进制版本 xff0c windows与macos不会重新编译 编译过程依赖openssl 但是centos7版本的
  • npm install提示没有权限

    npm install unsafe perm 61 true allow root
  • mysql排序后分页出现的数据混乱

    原因 xff1a 排序的字段值不唯一 xff0c 值相同时排序顺序不固定 解决方法 xff1a 增加排序字段改用值唯一的字段排序
  • Ubuntu安装mysql,修改数据存储目录

    1 创建目录并修改目录权限 mkdir home abc data chown R mysql mysql home abc data 2 修改mysql配置文件 etc mysql my cnf xff0c 增加以下配置 mysqld d
  • 获取CAS全部配置说明

    直接下载 xff1a CAS Server全部配置详解 通过cas bootadmin获取 通过CAS Initializr获取模块cas bootadmin server overlay curl http localhost 8080
  • SpringBoot配置SSL(https)

    生成证书 keytool genkey alias cas keyalg RSA validity 999 keysize 2048 storetype PKCS12 keypass aaaaaa storepass aaaaaa keys
  • 2018年秋招面经

    Data 2017 10 30 Author cjh 一不小心秋招都结束了 xff0c 趁还有些印象 xff0c 留下点东西造福大众 秋招一般聚集在9月初到10月底 xff0c 大公司快的有些8月中旬就开始了 xff0c 所以大家要把握时间
  • CAS Client部署

    参考内容 官方参考文档 xff1a Java Cas Client Cas Server部署参考 CAS Server部署 xff0c 基于版本6 6 4 修改配置 添加依赖 lt dependency gt lt groupId gt o
  • Python机器学习:train_test_split()划分数据集

    调用sklearn里面的model selection包的train test split 函数可以一行代码划分好数据集 包名 xff1a from sklearn model selection import train test spl
  • 安装Python3.8.10和ssh连接

    xff01 xff01 xff01 xff01 制作镜像之前防火墙要关掉 xff08 必须要关的 xff09 systemctl stop ufw span class token punctuation span service syst
  • WebSSH安装和开机自启设置

    一 安装 apt install nfs span class token punctuation span common WebSSH 要求 Python2 7 或 3 4 43 如果有 Python 环境 xff0c 可以使用 pip

随机推荐

  • novnc安装和开机自启设置

    一 安装和使用novnc 1 下载noNVC span class token function git span clone https github com novnc noVNC git 2 创建安装连接 VNC的默认会话不是安全的
  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器
  • 研究生如何发表论文必读

    研究生如何发表论文必读 这是一个一年三篇IF大于7的牛人当我问到他怎么这么强的时候 xff0c 他给我他在网上总结发文章的秘笈 看了实在是心中有一种感觉 xff0c 特奉献出来 一 研究生必备四本 俗话说好记性不如烂笔头 xff0c 所以一
  • Debian Linux进入不了图形界面的折腾

    首先我的操作系统是Debian Linux xff0c 我Debian用的是Xfce桌面环境 xff0c 昨天我用了命令apt get install gnome 安装了一堆软件之后重启 xff0c 就进入不了图形界面了 xff0c 只能进
  • ROS与matlab进行通讯—保姆级教程

    话不多说 xff0c 直接来进行配置 xff1a 所用软件 xff1a windows10下matlab2018b和同一台 电脑上虚拟机 virtubalbox上的Ubuntu melodic 18 04版本 第一步 xff1a 将虚拟机网
  • stm32蜂鸣器实验

    硬件连接 xff1a 提示 xff1a 不能通过IO口直接驱动大功率器件 实验步骤 xff1a 使能IO口时钟 调用RCC APB2PeriphColckCmd 初始化IO口模式 调用函数BEEP Init 操作IO口 xff0c 输出高低
  • samba源码安装

    Data 2017 11 30 Author cjh Theme samba源码安装 最近在玩TI的AM5728开发板 xff0c 采用交叉编译 xff0c 在使用nfs挂在确实有些不习惯 xff0c 所以最后还是忍不住在上面安装了samb
  • vscode使用

    VScode自动调整格式 Shift 43 Alt 43 F 简书 jianshu com vscode 设置 tab 为四个空格 abbcccdde的博客 CSDN博客 vscode设置tab为4个空格 生产力 VSCode必备插件 C
  • Ubuntu使用apt-get安装本地deb包

    Ubuntu使用apt get安装本地deb包 milantgh 博客园
  • 随遇而安也是一种选择

    随遇而安也是一种选择 故事的开头都是相似的 xff0c 故事的结尾各有各的传奇 xff0c 各有各的平凡 题记 高中的岁月总是让人难忘的 xff0c 菁菁岁月中的庆阳一中 xff0c 充满了书生意气的神采飞扬 xff0c 恩师与同窗 xff
  • OFDPA软件概述

    OFDPA软件概述 OF DPA xff08 openflow data plane abstraction xff09 是一个应用软件组件 实现了 openflow与broadcom SDK间适配层的功能 OF DPA在broadcom交
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf