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 相关文章推荐
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
Mar 16 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
Jul 09 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
JS匀速运动演示示例代码
Nov 26 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
如何在node的express中使用socket.io
Dec 15 Javascript
JavaScript删除指定子元素代码实例
Jan 13 Javascript
javascript实现限制上传文件大小
Feb 06 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
浅谈webpack-dev-server的配置和使用
May 17 Javascript
ElementUI radio组件选中小改造
Aug 12 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
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
转一个日期输入控件,支持FF
2007/04/27 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
2017/01/13 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
2017/04/11 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
numpy返回array中元素的index方法
2018/06/27 Python
Django框架验证码用法实例分析
2019/05/10 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
python tkinter组件使用详解
2019/09/16 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
python 带时区的日期格式化操作
2020/10/23 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
语文教育专业推荐信范文
2013/11/25 职场文书
管道维修工岗位职责
2013/12/27 职场文书
初中家长寄语
2014/04/02 职场文书
2015年工商所工作总结
2015/05/21 职场文书
学校财务管理制度
2015/08/04 职场文书
汉语拼音教学反思
2016/02/22 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS