浅析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 相关文章推荐
js实现checkbox全选和反选示例
May 01 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
深入理解JavaScript中的对象
Jun 04 Javascript
如何通过js实现图片预览功能【附实例代码】
Mar 30 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
Mar 04 Javascript
Vue 实现双向绑定的四种方法
Mar 16 Javascript
从零开始实现Vue简单的Toast插件
Dec 03 Javascript
express express-session的使用小结
Dec 12 Javascript
react高阶组件添加和删除props
Apr 26 Javascript
关于Javascript闭包与应用的详解
Apr 22 Javascript
微信小程序APP页面的之间的相互传递参数以及自定义组件
Apr 19 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判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python基于Selenium的web自动化框架
2019/07/14 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
学前教育求职自荐信范文
2013/12/25 职场文书
车间主任岗位职责
2014/03/16 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
Mysql数据库命令大全
2021/05/26 MySQL
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
讲解Python实例练习逆序输出字符串
2022/05/06 Python