浅析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 相关文章推荐
用Jquery重写windows.alert方法实现思路
Apr 03 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
Mar 12 Javascript
简述JavaScript中正则表达式的使用方法
Jun 15 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
Nov 13 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
JavaScript 函数的定义-调用、注意事项
Apr 16 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
Nov 24 Javascript
express如何使用session与cookie的方法
Jan 30 Javascript
JavaScript循环遍历你会用哪些之小结篇
Sep 28 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
PHP中函数内引用全局变量的方法
2008/10/20 PHP
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
详细探究Python中的字典容器
2015/04/14 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
python中学习K-Means和图片压缩
2017/11/20 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
python numpy 反转 reverse示例
2019/12/04 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
如何使用python代码操作git代码
2020/02/29 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
三严三实对照检查材料思想汇报
2014/09/28 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android
浅析Python OpenCV三种滤镜效果
2022/04/11 Python