为什么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 相关文章推荐
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
window.location.href的用法(动态输出跳转)
Aug 09 Javascript
js遍历子节点子元素附属性及方法
Aug 19 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
node.js将MongoDB数据同步到MySQL的步骤
Dec 10 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 Javascript
Angular 多模块项目构建过程
Feb 13 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 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
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
python使用pymysql实现操作mysql
2016/09/13 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
tensorflow实现图像的裁剪和填充方法
2018/07/27 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
外企求职信范文分享
2013/12/31 职场文书
称象教学反思
2014/02/03 职场文书
法人授权委托书
2014/09/16 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
门面租赁合同范文
2019/08/06 职场文书
springcloud整合seata
2022/05/20 Java/Android