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中的document.referrer在各种浏览器测试结果
Jul 18 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
Aug 07 Javascript
node.js中使用socket.io的方法
Dec 15 Javascript
jquery实现的代替传统checkbox样式插件
Jun 19 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
AngularJS入门教程之静态模板详解
Aug 18 Javascript
Node.js测试中的Mock文件系统详解
Nov 21 Javascript
微信小程序 跳转传递数据的实例
Jul 06 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
Oct 18 Javascript
使用Vue自定义数字键盘组件(体验度极好)
Dec 19 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 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/03/31 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
js操作iframe父子窗体示例
2014/05/22 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
爬山算法简介和Python实现实例
2014/04/26 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
行政经理的岗位职责
2013/11/23 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
企业工会工作总结2015
2015/05/13 职场文书
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers