浅析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获取当前日期和时间的简单实例
Nov 19 Javascript
ExtJS判断IE浏览器类型的方法
Feb 10 Javascript
js给selected添加options的方法
May 06 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
Dec 21 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
Threejs实现滴滴官网首页地球动画功能
Jul 13 Javascript
vue 实现把路由单独分离出来
Aug 13 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
咖啡与牛奶
2021/03/03 冲泡冲煮
一个php作的文本留言本的例子(三)
2006/10/09 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
PHP图片加水印实现方法
2016/05/06 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP 断点续传实例详解
2017/11/11 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
从零学Python之入门(三)序列
2014/05/25 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
python根据url地址下载小文件的实例
2018/12/18 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
PHP面试题-$message和$$message的区别
2015/12/08 面试题
垃圾分类的活动方案
2014/08/15 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
工作收入证明模板
2015/06/12 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript