为什么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 相关文章推荐
php 中序列化和json使用介绍
Jul 08 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
Oct 31 Javascript
生成二维码方法汇总
Dec 26 Javascript
JS组件系列之Bootstrap Icon图标选择组件
Jan 28 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
Oct 28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
Angular多选、全选、批量选择操作实例代码
Mar 10 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
Apr 17 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
Aug 25 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
Sep 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
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
JavaScript电子时钟倒计时第二款
2016/01/10 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python中学习K-Means和图片压缩
2017/11/20 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python实现画循环圆
2019/11/23 Python
通过实例解析Python调用json模块
2019/12/11 Python
Python属性和内建属性实例解析
2020/01/14 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
数组越界问题
2015/10/21 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
财务与信息服务专业推荐信
2013/11/28 职场文书
公司出纳岗位职责
2013/12/07 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
岳庙导游词
2015/02/04 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
Python基础知识之变量的详解
2021/04/14 Python
python 如何做一个识别率百分百的OCR
2021/05/29 Python
Win11查看设备管理器
2022/04/19 数码科技