为什么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 特殊字符串
Feb 25 Javascript
jQuery判断iframe中元素是否存在的方法
May 11 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
javascript变量声明实例分析
Apr 25 Javascript
详解JavaScript中getFullYear()方法的使用
Jun 10 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
vue 中swiper的使用教程
May 22 Javascript
vue移动端轻量级的轮播组件实现代码
Jul 12 Javascript
layui实现给某一列加点击事件
Oct 26 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 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
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
jQuery中each()方法用法实例
2014/12/27 Javascript
javascript 实现map集合
2015/04/03 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python实现控制台输出彩色字体
2020/04/05 Python
Django Path转换器自定义及正则代码实例
2020/05/29 Python
信息学院毕业生自荐信范文
2014/03/04 职场文书
《长相思》听课反思
2014/04/10 职场文书
婚纱店策划方案
2014/05/22 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
班级联欢会主持词
2015/07/03 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技