为什么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新窗口与子窗口传值详解
Feb 11 Javascript
Bootstrap每天必学之导航条
Nov 27 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
Jun 08 Javascript
详解webpack es6 to es5支持配置
May 04 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
Vue路由切换时的左滑和右滑效果示例
May 29 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
JS图片懒加载的优点及实现原理
Jan 10 Javascript
javascript实现页面的实时时钟显示示例
Aug 06 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
详解vue-router的导航钩子(导航守卫)
Nov 02 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
基于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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
咖啡常见的种类
2021/03/03 新手入门
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
javascript常用的方法整理
2015/08/20 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python 中的列表解析和生成表达式
2011/03/10 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
深入理解Python中字典的键的使用
2015/08/19 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
学生周末回家住宿长期请假条
2014/02/15 职场文书
春节联欢会主持词
2014/03/24 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
城市创卫标语
2014/06/17 职场文书
篮球赛口号
2014/06/18 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
python实现局部图像放大
2021/11/17 Python