浅析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表单验证代码
Aug 02 Javascript
js更优雅的兼容
Aug 12 Javascript
基于jquery的无限级联下拉框js插件
Oct 29 Javascript
jquery Mobile入门—多页面切换示例学习
Jan 08 Javascript
百度地图api如何使用
Aug 03 Javascript
JavaScript中localStorage对象存储方式实例分析
Jan 12 Javascript
Node学习记录之cluster模块
May 31 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
Apr 26 Javascript
JavaScript函数定义方法实例详解
Mar 05 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
js实现简单的无缝轮播效果
Sep 05 Javascript
如何基于viewport vm适配移动端页面
Nov 13 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
调频问题解答
2021/03/01 无线电
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP入门教程之操作符与控制结构流程详解
2016/09/09 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
javascript生成大小写字母
2015/07/03 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
小小商店教学反思
2014/04/27 职场文书
灰雀教学反思
2014/04/28 职场文书
迁户口计划生育证明
2014/10/19 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
Django显示可视化图表的实践
2021/05/10 Python