浅析js中的浮点型运算问题


Posted in Javascript onJanuary 06, 2014

js中浮点型是如何运算的呢?

例如:var a=0.69;

我想得到6.9 直接这样写 var c=a*10;

alert(c);   得到结果是:6.8999999999999995

到网上一搜,有网友说这是一个JS浮点数运算Bug,找了解决方法:

方法一:有js自定义函数

<script>
//加法函数,用来得到精确的加法结果 
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用:accAdd(arg1,arg2) 
//返回值:arg1加上arg2的精确结果 
function accAdd(arg1,arg2){ 
var r1,r2,m; 
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 
m=Math.pow(10,Math.max(r1,r2)) 
return (arg1*m+arg2*m)/m 
} 
//给Number类型增加一个add方法,调用起来更加方便。 
Number.prototype.add = function (arg){ 
return accAdd(arg,this); 
}
//加法函数,用来得到精确的加法结果 
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。 
//调用:accAdd(arg1,arg2) 
//返回值:arg1加上arg2的精确结果 
function accSub(arg1,arg2){
    var r1,r2,m,n;
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
    m=Math.pow(10,Math.max(r1,r2));
    //last modify by deeka
    //动态控制精度长度
    n=(r1>=r2)?r1:r2;
    return ((arg1*m-arg2*m)/m).toFixed(n);
}
//除法函数,用来得到精确的除法结果 
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 
//调用:accDiv(arg1,arg2) 
//返回值:arg1除以arg2的精确结果 
function accDiv(arg1,arg2){ 
var t1=0,t2=0,r1,r2; 
try{t1=arg1.toString().split(".")[1].length}catch(e){} 
try{t2=arg2.toString().split(".")[1].length}catch(e){} 
with(Math){ 
r1=Number(arg1.toString().replace(".","")) 
r2=Number(arg2.toString().replace(".","")) 
return (r1/r2)*pow(10,t2-t1); 
} 
} 
//给Number类型增加一个div方法,调用起来更加方便。 
Number.prototype.div = function (arg){ 
return accDiv(this, arg); 
} 
//乘法函数,用来得到精确的乘法结果 
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 
//调用:accMul(arg1,arg2) 
//返回值:arg1乘以arg2的精确结果 
function accMul(arg1,arg2) 
{ 
var m=0,s1=arg1.toString(),s2=arg2.toString(); 
try{m+=s1.split(".")[1].length}catch(e){} 
try{m+=s2.split(".")[1].length}catch(e){} 
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) 
} 
//给Number类型增加一个mul方法,调用起来更加方便。 
Number.prototype.mul = function (arg){ 
return accMul(arg, this); 
} 
var a=0.69;
var b=10;
alert(a*b);//6.8999999999999995
alert((a*100)/10);
</script>

直接调用函数就可以。

方法二:如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

alert(11*22.9);//得到251.89999999999998
alert(11*(22.9*10)/10);//得到251.9

Javascript 相关文章推荐
javascript 树控件 比较好用
Jun 11 Javascript
有关js的变量作用域和this指针的讨论
Dec 16 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
Oct 29 Javascript
javascript操作字符串的原生方法
Dec 22 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
jQuery多级手风琴菜单实例讲解
Oct 22 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
解读vue生成的文件目录结构及说明
Nov 27 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
JavaScript创建、读取和删除cookie
Sep 03 Javascript
javascript实现简易的计算器
Jan 17 Javascript
实例讲解React 组件
Jul 07 Javascript
js中浮点型运算BUG的解决方法说明
Jan 06 #Javascript
Jquery操作radio的简单实例
Jan 06 #Javascript
jQuery选择器全面总结
Jan 06 #Javascript
JavaScript定义类的几种方式总结
Jan 06 #Javascript
javascript函数定义的几种区别小结
Jan 06 #Javascript
javascript 用函数语句和表达式定义函数的区别详解
Jan 06 #Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 #Javascript
You might like
怎么使 Mysql 数据同步
2006/10/09 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
动态表格Table类的实现
2009/08/26 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
销售部主管岗位职责
2013/12/18 职场文书
清明节演讲稿
2014/05/27 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年司法局工作总结
2014/12/11 职场文书
还款承诺书范本
2015/01/20 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
golang 实现并发求和
2021/05/08 Golang
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
详解Laravel框架的依赖注入功能
2021/05/27 PHP
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android