浅析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 delete操作符应用实例
Jan 13 Javascript
JSON+JavaScript处理JSON的简单例子
Mar 20 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
Jan 13 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
Javascript blur与click冲突解决办法
Jan 09 Javascript
微信小程序 navbar实例详解
May 11 Javascript
安装vue-cli的简易过程
May 22 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 Javascript
vue+flask实现视频合成功能(拖拽上传)
Mar 04 Vue.js
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
SONY ICF-SW55的电路分析
2021/03/02 无线电
php中文字符截取防乱码
2008/03/28 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
Python中生成Epoch的方法
2017/04/26 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
护士自我介绍信
2014/01/13 职场文书
幼儿园教师个人反思
2014/01/30 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
锅炉工岗位职责
2015/02/13 职场文书