为什么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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
window.js 主要包含了页面的一些操作
Dec 23 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
JS实现环形进度条(从0到100%)效果
Jul 05 Javascript
Bootstrap超大屏幕的实现代码
Mar 22 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
vue系列之动态路由详解【原创】
Sep 10 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
vue车牌号校验和银行校验实战
Jan 23 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
Vue中jsx不完全应用指南小结
Nov 01 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
基于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 download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php实现mysql封装类示例
2014/05/07 PHP
基于php判断客户端类型
2016/10/14 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
Vue 进阶教程之v-model详解
2017/05/06 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
Webpack执行命令参数详解
2017/06/17 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
Python3 Random模块代码详解
2017/12/04 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
中国宠物用品商城:E宠商城
2016/08/27 全球购物
《王二小》教学反思
2014/02/27 职场文书
解除租房协议书
2014/12/03 职场文书