Javascript 浮点运算的问题分析与解决方法


Posted in Javascript onAugust 27, 2013

十进制           二进制
0.1              0.0001 1001 1001 1001 ...
0.2              0.0011 0011 0011 0011 ...
0.3              0.0100 1100 1100 1100 ...
0.4              0.0110 0110 0110 0110 ...
0.5              0.1
0.6              0.1001 1001 1001 1001 ...
所以比如 1.1 ,其程序实际上无法真正的表示 ‘1.1',而只能做到一定程度上的准确,这是无法避免的精度丢失:

1.09999999999999999
在JavaScript中问题还要复杂些,这里只给一些在Chrome中测试数据:

 输入               输出
1.0-0.9 == 0.1     False
1.0-0.8 == 0.2     False
1.0-0.7 == 0.3     False
1.0-0.6 == 0.4     True
1.0-0.5 == 0.5     True
1.0-0.4 == 0.6     True
1.0-0.3 == 0.7     True
1.0-0.2 == 0.8     True
1.0-0.1 == 0.9     True
解决
那如何来避免这类 1.0-0.9 != 0.1 的非bug型问题发生呢?下面给出一种目前用的比较多的解决方案, 在判断浮点运算结果前对计算结果进行精度缩小,因为在精度缩小的过程总会自动四舍五入:

(1.0-0.9).toFixed(digits)                   // toFixed() 精度参数须在 0 与20 之间
parseFloat((1.0-0.9).toFixed(10)) === 0.1   // 结果为True
parseFloat((1.0-0.8).toFixed(10)) === 0.2   // 结果为True
parseFloat((1.0-0.7).toFixed(10)) === 0.3   // 结果为True
parseFloat((11.0-11.8).toFixed(10)) === -0.8   // 结果为True

方法提炼
// 通过isEqual工具方法判断数值是否相等
function isEqual(number1, number2, digits){
 digits = digits == undefined? 10: digits; // 默认精度为10
 return number1.toFixed(digits) === number2.toFixed(digits);
}
isEqual(1.0-0.7, 0.3);  // return true
// 原生扩展方式,更喜欢面向对象的风格
Number.prototype.isEqual = function(number, digits){
 digits = digits == undefined? 10: digits; // 默认精度为10
 return this.toFixed(digits) === number.toFixed(digits);
}
(1.0-0.7).isEqual(0.3); // return true
Javascript 相关文章推荐
javascript arguments 传递给函数的隐含参数
Aug 21 Javascript
firefox下input type="file"的size是多大
Oct 24 Javascript
JQuery插件Style定制化方法的分析与比较
May 03 Javascript
Js获取数组最大和最小值示例代码
Oct 29 Javascript
禁止IE用右键的JS代码
Dec 30 Javascript
javascript+ajax实现产品页面加载信息
Jul 09 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
Jun 09 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
bootstrap table支持高度百分比的实例代码
Feb 28 Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 #Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 #Javascript
关于Jquery操作Cookie取值错误的解决方法
Aug 26 #Javascript
jquery弹出框的用法示例(2)
Aug 26 #Javascript
jquery弹出框的用法示例(一)
Aug 26 #Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 #Javascript
使用js实现雪花飘落效果
Aug 26 #Javascript
You might like
php支持中文字符串分割的函数
2015/05/28 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
IE8 原生JSON支持
2009/04/13 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python简单读取json文件功能示例
2017/11/30 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
基于python实现图片转字符画代码实例
2020/09/04 Python
Python实现自动装机功能案例分析
2020/10/22 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
python3字符串输出常见面试题总结
2020/12/01 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
英国第一家领先的在线处方眼镜零售商:Glasses Direct
2018/02/23 全球购物
单位消防安全责任书
2014/07/23 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
Vue操作Storage本地化存储
2022/04/29 Vue.js