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 文本框水印/占位符(watermark/placeholder)实现方法
Jan 15 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
Sep 19 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
jquery实现简易的移动端验证表单
Nov 08 Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 Javascript
JS实现的视频弹幕效果示例
Aug 17 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 Javascript
用React Native制作一个简单的游戏引擎
May 27 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
多文件上传的例子
2006/10/09 PHP
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
php组合排序简单实现方法
2016/10/15 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
Python寻找路径和查找文件路径的示例
2019/07/10 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
《学会合作》教学反思
2014/04/12 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
学校运动会加油词
2015/07/18 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
Python+pyaudio实现音频控制示例详解
2022/07/23 Python