为什么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中常用编程知识
Apr 08 Javascript
javascript实现带下拉子菜单的导航菜单效果
May 14 Javascript
jQuery实现二级下拉菜单效果
Jan 05 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
Mar 05 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
详解在Node.js中发起HTTP请求的5种方法
Jan 10 Javascript
详解vue中router-link标签所必备了解的属性
Apr 15 Javascript
Vue的属性、方法、生命周期实例代码详解
Sep 17 Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 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中strtotime函数使用方法分享
2012/01/10 PHP
php _autoload自动加载类与机制分析
2012/02/10 PHP
PHP在线书签系统分享
2016/01/04 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
vue v-for直接循环数字实例
2019/11/07 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
python中类的一些方法分析
2014/09/25 Python
Python切片知识解析
2016/03/06 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Python内置函数property()如何使用
2020/09/01 Python
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
存储过程的优缺点是什么
2015/01/10 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
abstract class和interface有什么区别
2013/08/04 面试题
环保建议书500字
2014/05/14 职场文书
奠基仪式策划方案
2014/05/15 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
团员个人年度总结
2015/02/26 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
win11无法添加打印机怎么办? 提示windows无法打开添加打印机的解决办法
2022/04/05 数码科技
尝试使用Python爬取城市租房信息
2022/04/12 Python