为什么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 相关文章推荐
json简单介绍
Jun 10 Javascript
真正的JQuery.ajax传递中文参数的解决方法
May 28 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
ECMAScript6 新特性范例大全
Mar 24 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
node(koa2) web应用模块介绍详解
Mar 29 Javascript
详解Vue之父子组件传值
Apr 01 Javascript
深入了解js原型模式
May 30 Javascript
layer.alert自定义关闭回调事件的方法
Sep 27 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
php生成随机数的三种方法
2014/09/10 PHP
PHP面向对象详解(三)
2015/12/07 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
JavaScript修改css样式style
2008/04/15 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
document.createElement()用法
2013/03/13 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
AngularJs 常用的过滤器
2017/05/15 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
django如何通过类视图使用装饰器
2019/07/24 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
大学四年规划书范文
2013/12/27 职场文书
生物制药专业求职信
2014/03/11 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
MySQL日期时间函数知识汇总
2022/03/17 MySQL
利用Python实现模拟登录知乎
2022/05/25 Python