为什么JavaScript中0.1 + 0.2 != 0.3


Posted in Javascript onDecember 03, 2020

涉及面试题:为什么 0.1 + 0.2 != 0.3?如何解决这个问题?

原因,因为 JS 采用 IEEE 754双精度版本(64位),并且只要采用 IEEE 754的语言都有该问题

我们都知道计算机是通过二进制来存储东西的,那么 0.1 在二进制中会表示为

// (0011) 表示循环
0.1 = 2^-4 * 1.10011(0011)

我们可以发现,0.1 在二进制中是无限循环的一些数字,其实不只是 0.1,其实很多十进制小数用二进制表示都是无限循环的。这样其实没什么问题,但是 JS采用的浮点数标准却会裁剪掉我们的数字。

IEEE 754 双精度版本(64位)将 64 位分为了三段

  • 第一位用来表示符号
  • 接下去的 11 位用来表示指数
  • 其他的位数用来表示有效位,也就是用二进制表示 0.1 中的 10011(0011)

那么这些循环的数字被裁剪了,就会出现精度丢失的问题,也就造成了 0.1 不再是 0.1 了,而是变成了 0.100000000000000002

0.100000000000000002 === 0.1 // true

那么同样的,0.2 在二进制也是无限循环的,被裁剪后也失去了精度变成了 0.200000000000000002

0.200000000000000002 === 0.2 // true

所以这两者相加不等于 0.3 而是 0.300000000000000004

0.1 + 0.2 === 0.30000000000000004 // true

那么可能你又会有一个疑问,既然 0.1 不是 0.1,那为什么 console.log(0.1) 却是正确的呢?

因为在输入内容的时候,二进制被转换为了十进制,十进制又被转换为了字符串,在这个转换的过程中发生了取近似值的过程,所以打印出来的其实是一个近似值,你也可以通过以下代码来验证

console.log(0.100000000000000002) // 0.1

解决

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

到此这篇关于为什么JavaScript中0.1 + 0.2 != 0.3的文章就介绍到这了,更多相关JS中0.1 + 0.2 != 0.3内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Prototype源码浅析 String部分(三)之HTML字符串处理
Jan 15 Javascript
jQuery中scrollTop()方法用法实例
Jan 16 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
详解JavaScript逻辑And运算符
Dec 04 Javascript
jquery实现倒计时功能
Dec 28 Javascript
jQuery简易时光轴实现方法示例
Mar 13 Javascript
使用vue构建移动应用实战代码
Aug 02 Javascript
利用three.js画一个3D立体的正方体示例代码
Nov 19 Javascript
js实现二级菜单点击显示当前内容效果
Apr 28 Javascript
使用vue-router为每个路由配置各自的title
Jul 30 Javascript
微信小程序新手教程之启动页的重要性
Mar 03 Javascript
Node使用Nodemailer发送邮件的方法实现
Feb 24 Javascript
基于javascript实现放大镜特效
Dec 03 #Javascript
javascript实现时钟动画
Dec 03 #Javascript
javascript中导出与导入实现模块化管理教程
Dec 03 #Javascript
JS如何实现在弹出窗口中加载页面
Dec 03 #Javascript
对vue生命周期的深入理解
Dec 03 #Vue.js
在实例中重学JavaScript事件循环
Dec 03 #Javascript
js 数据类型判断的方法
Dec 03 #Javascript
You might like
第一个无线电台是由谁发明的
2021/03/01 无线电
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
浅谈json_encode用法
2015/03/05 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
js 替换
2008/02/19 Javascript
ext 代码生成器
2009/08/07 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
通过代码实例了解Python异常本质
2020/09/16 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
贸易跟单员英文求职信
2014/04/19 职场文书
公司节能减排方案
2014/05/16 职场文书
会计试用期自我评价
2014/09/19 职场文书
演讲开场白和结束语
2015/05/29 职场文书
实习单位意见
2015/06/04 职场文书
春节慰问简报
2015/07/21 职场文书
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js