为什么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 相关文章推荐
js类型检查实现代码
Oct 29 Javascript
js 上传图片预览问题
Dec 06 Javascript
jQuery中dequeue()方法用法实例
Dec 29 Javascript
js实现两点之间画线的方法
May 12 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
jQuery内存泄露解决办法
Dec 13 Javascript
Jqprint实现页面打印
Jan 06 Javascript
ES7中利用Await减少回调嵌套的方法详解
Nov 01 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
ant design vue中表格指定格式渲染方式
Oct 28 Javascript
用JS写一个发布订阅模式
Nov 07 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简单定时执行任务的实现方法
2015/02/23 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
js实现聊天对话框
2020/02/08 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
Python多线程和队列操作实例
2015/06/21 Python
python语言使用技巧分享
2016/05/31 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
英国假发网站:Hothair
2018/02/23 全球购物
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
怎样创建、运行java程序
2014/08/01 面试题
给水工程专业毕业生自荐信
2014/01/28 职场文书
商场促销活动总结
2014/07/10 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书