为什么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的闭包
Dec 31 Javascript
js读取配置文件自写
Feb 11 Javascript
js生成缩略图后上传并利用canvas重绘
May 15 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
vue-cli的webpack模板项目配置文件分析
Apr 01 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
Vue2 监听属性改变watch的实例代码
Aug 27 Javascript
JS 创建对象的模式实例小结
Apr 28 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
js仿淘宝放大镜效果
Dec 28 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
浅析get与post的一些特殊情况
2014/07/28 PHP
javascript 写类方式之七
2009/07/05 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
JSONP跨域请求
2017/03/02 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
老生常谈Python基础之字符编码
2017/06/14 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
py-charm延长试用期限实例
2019/12/22 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
八一慰问活动方案
2014/02/07 职场文书
出纳试用期自我鉴定
2014/04/07 职场文书
小学语文教研活动总结
2014/07/01 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
法人代表资格证明书
2015/06/18 职场文书
业务员管理制度范本
2015/08/06 职场文书
新党员入党决心书
2015/09/22 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
vue如何清除浏览器历史栈
2022/05/25 Vue.js