为什么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中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 Javascript
AngularJS通过$sce输出html的方法
Sep 22 Javascript
react-native 完整实现登录功能的示例代码
Sep 11 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
Vue header组件开发详解
Jan 26 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
axios携带cookie配置详解(axios+koa)
Dec 28 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 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
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
PHP QRCODE生成彩色二维码的方法
2016/05/19 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
Open and Print a Word Document
2007/06/15 Javascript
js 目录列举函数
2008/11/06 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
python调用私有属性的方法总结
2020/07/24 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
恒华伟业笔试面试题
2015/02/26 面试题
上课迟到检讨书100字
2014/01/11 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫