浅析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 相关文章推荐
十个优秀的Ajax/Javascript实例网站收集
Mar 31 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
Jun 06 Javascript
在javascript中创建对象的各种模式解析
May 16 Javascript
jquery中用函数来设置css样式
Dec 22 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
Mar 06 Javascript
js实现同一个页面,多个enter事件绑定的示例
Oct 10 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
一文快速详解前端框架 Vue 最强大的功能
May 21 Javascript
Javascript原生ajax请求代码实例
Feb 20 Javascript
浅谈JavaScript浅拷贝和深拷贝
Nov 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
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
react路由配置方式详解
2017/08/07 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
vue使用video.js进行视频播放功能
2019/07/18 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
20个常用Python运维库和模块
2018/02/12 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2018/12/04 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
十佳文明家庭事迹
2014/05/25 职场文书
保护动物的标语
2014/06/11 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
Docker官方工具docker-registry案例演示
2022/04/13 Servers