解决JavaScript中0.1+0.2不等于0.3问题


Posted in Javascript onOctober 23, 2018
console.log(0.1+0.2===0.3)// true or false??

在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!==0.3,这是为什么呢?这个问题也会偶尔被用来当做面试题来考查面试者对JavaScript的数值的理解程度。

在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为false。

那么应该怎样来解决0.1+0.2等于0.3呢? 最好的方法是设置一个误差范围值,通常称为”机器精度“,而对于Javascript来说,这个值通常是2^-52,而在ES6中,已经为我们提供了这样一个

属性:Number.EPSILON,而这个值正等于2^-52。这个值非常非常小,在底层计算机已经帮我们运算好,并且无限接近0,但不等于0,。这个时候我们只要判断(0.1+0.2)-0.3小于

Number.EPSILON,在这个误差的范围内就可以判定0.1+0.2===0.3为true。

function numbersequal(a,b){ return Math.abs(a-b)<Number.EPSILON;
  } 
  var a=0.1+0.2, b=0.3;
  console.log(numbersequal(a,b)); //true

但是这里要考虑兼容性的问题了,在chrome中支持这个属性,但是IE并不支持(笔者的版本是IE10不兼容),所以我们还要解决IE的不兼容问题。

Number.EPSILON=(function(){   //解决兼容性问题
        return Number.EPSILON?Number.EPSILON:Math.pow(2,-52);
      })();
//上面是一个自调用函数,当JS文件刚加载到内存中,就会去判断并返回一个结果,相比if(!Number.EPSILON){
  //   Number.EPSILON=Math.pow(2,-52);
  //}这种代码更节约性能,也更美观。
function numbersequal(a,b){ 
    return Math.abs(a-b)<Number.EPSILON;
  }
//接下来再判断   
    var a=0.1+0.2, b=0.3;
  console.log(numbersequal(a,b)); //这里就为true了

 

这个是二进制浮点数最大的问题(不仅JavaScript,所有遵循IEEE 754规范的语言都是如此)。

注意:有人认为,JavaScript应该采用一种可以精确呈现数字的实现方式。一直以来出现过很多替代方案,只是都没能成为标准,以后大概也不会。这个问题看似简单,实则不然,否则早就解决了。 

问题是,如果一些数字无法做到完全精确,是否意味着数字类型毫无用处呢?答案当然是否定的。

    在处理带有小数的数字时需要特别注意。很多(也许是绝大多数)程序只需要处理整数,最大不超过百万或者万亿,此时使用JavaScript 的数字类型是绝对安全的。

总结

以上所述是小编给大家介绍的解决JavaScript中0.1+0.2不等于0.3问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
Jan 26 Javascript
使用js显示当前时间示例
Mar 02 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
asp.net+js实现金额格式化
Feb 27 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
Sep 09 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
Sep 12 Javascript
node.js中module.exports与exports用法上的区别
Sep 02 Javascript
Bootstrap 网格系统布局详解
Mar 19 Javascript
vue-cli 引入、配置axios的方法
May 08 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
js实现简单的贪吃蛇游戏
Apr 23 Javascript
React 路由懒加载的几种实现方案
Oct 23 #Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 #Javascript
详解React 的几种条件渲染以及选择
Oct 23 #Javascript
详解create-react-app 2.0版本如何启用装饰器语法
Oct 23 #Javascript
彻底弄懂 JavaScript 执行机制
Oct 23 #Javascript
深入理解JavaScript 中的执行上下文和执行栈
Oct 23 #Javascript
浅谈JavaScript 代码整洁之道
Oct 23 #Javascript
You might like
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
Element Dialog对话框的使用示例
2020/07/26 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
深入理解python中的atexit模块
2017/03/07 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
后勤主管岗位职责
2014/03/01 职场文书
销售会计岗位职责
2014/03/15 职场文书
快递员岗位职责
2014/09/12 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
信访工作个人总结
2015/03/03 职场文书
如何优化vue打包文件过大
2022/04/13 Vue.js
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS