为什么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 相关文章推荐
jquery插件制作 自增长输入框实现代码
Aug 17 jQuery
jQuery获取浏览器中的分辨率实现代码
Apr 23 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
May 08 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
Nov 03 Javascript
vue router demo详解
Oct 13 Javascript
Js利用prototype自定义数组方法示例
Oct 20 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 Javascript
element-ui table组件如何使用render属性的实现
Nov 04 Javascript
JavaScript实现拖拽效果
Mar 16 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
在vue项目中利用popstate处理页面返回的操作介绍
Aug 06 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关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
php内嵌函数用法实例
2015/03/20 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python MD5文件生成码
2009/01/12 Python
python 解析html之BeautifulSoup
2009/07/07 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
如何写辞职书
2015/02/26 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS