为什么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里使用Dom操作Xml
Sep 20 Javascript
有关javascript的性能优化 (repaint和reflow)
Apr 12 Javascript
JavaScript拆分字符串时产生空字符的解决方案
Sep 26 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
详解微信小程序调起键盘性能优化
Jul 24 Javascript
了解重排与重绘
May 29 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 Javascript
Element Tooltip 文字提示的使用示例
Jul 26 Javascript
JS中多层次排序算法的实现代码
Jan 06 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下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
python实现视频读取和转化图片
2019/12/10 Python
Python socket处理client连接过程解析
2020/03/18 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
物理教育专业毕业生推荐信
2013/11/03 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Python OpenCV超详细讲解基本功能
2022/04/02 Python
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技