为什么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 相关文章推荐
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
基于jQuery滑动杆实现购买日期选择效果
Sep 15 Javascript
Web安全测试之XSS实例讲解
Aug 15 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
webpack+react+antd脚手架优化的方法
Apr 02 Javascript
微信小程序实现收货地址左滑删除
Nov 18 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
Sep 22 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
JavaScript实现淘宝商品图切换效果
Apr 29 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 各种排序算法实现代码
2009/08/20 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
Use Word to Search for Files
2007/06/15 Javascript
url 编码 js url传参中文乱码解决方案
2010/04/11 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jQuery实用基础超详细介绍
2013/04/11 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
小学生班会演讲稿
2014/01/09 职场文书
五型班组建设方案
2014/02/10 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
党员活动总结
2015/02/04 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
运动会主持词大全
2015/07/02 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书