浅析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 简单高效判断数据类型 系列函数 By shawl.qiu
Mar 06 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
Oct 24 Javascript
jquery延迟加载外部js实现代码
Jan 11 Javascript
jQuery仿Excel表格编辑功能的实现代码
May 01 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
Jun 08 Javascript
原生JavaScript实现滑动拖动验证的示例代码
Dec 06 Javascript
js实现中文实时时钟
Jan 15 Javascript
vue使用原生swiper代码实例
Feb 05 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相关资料
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
python 下载文件的多种方法汇总
2020/11/17 Python
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
怎样创建、运行java程序
2014/08/01 面试题
巡警年度自我鉴定
2014/02/21 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
继承权公证书范本
2015/01/23 职场文书
队名及霸气口号大全
2015/12/25 职场文书
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
python实现手机推送 代码也就10行左右
2022/04/12 Python