浅析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实现jQuery的$.getJSON的解决方法
May 03 Javascript
jquery ajax修改全局变量示例代码
Nov 08 Javascript
jquery select 设置默认选中的示例代码
Feb 07 Javascript
Javascript实现跨域后台设置拦截的方法详解
Aug 04 Javascript
js定时器实现倒计时效果
Nov 05 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
Nov 22 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
Mar 21 Javascript
Vue组件全局注册实现警告框的实例详解
Jun 11 Javascript
webpack4.x下babel的安装、配置及使用详解
Mar 07 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 Javascript
node.js如何自定义实现一个EventEmitter
Jul 16 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中ob_start()函数的用法
2013/06/24 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
js实现每日签到功能
2018/11/29 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
CSS3 画基本图形,圆形、椭圆形、三角形等
2016/09/20 HTML / CSS
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
《永远的白衣战士》教学反思
2014/04/25 职场文书
计生专干事迹
2014/05/28 职场文书
学校宣传标语
2014/06/18 职场文书
员工安全责任书范本
2014/07/24 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers