为什么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 drag拖动代码
Dec 09 Javascript
c#和Javascript操作同一json对象的实现代码
Jan 17 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
一个判断抢购时间是否到达的简单的js函数
Jun 23 Javascript
JS作用域链详解
Jun 26 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
js实现图片局部放大效果详解
Mar 18 Javascript
详细分析vue表单数据的绑定
Jul 20 Javascript
Vue.Draggable实现交换位置
Apr 07 Vue.js
微前端qiankun改造日渐庞大的项目教程
Jun 21 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实现邮件群发的源码
2013/06/18 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
vue如何截取字符串
2019/05/06 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
python对excel文档去重及求和的实例
2018/04/18 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
空指针到底是什么
2012/08/07 面试题
请解释流与文件有什么不同
2016/07/29 面试题
出纳岗位职责模板
2013/11/27 职场文书
室内设计专业学生的自我评价分享
2013/11/27 职场文书
生日寄语大全
2014/04/08 职场文书
音乐节策划方案
2014/06/09 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
小班教师个人总结
2015/02/05 职场文书
英语通知范文
2015/04/22 职场文书
教师病假条范文
2015/08/17 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
python四种出行路线规划的实现
2021/06/23 Python