解决JS中乘法的浮点错误的方法


Posted in Javascript onJanuary 03, 2014

JS里做小数的乘法运算时会出现浮点错误,具体可以测试一下: 

<script>
alert(11*22.9)
</script>

结果是251.89999999999998 而不是251.9 

这个问题想必有很多人为之头痛。那么如何解决呢?在此给出解决办法。

1、

<script> 
alert(11*(22.9*10)/10); 
</script> 
 
解决问题的大概思路就是,先把因数放大为整数,最后再除以相应的倍数,这样就能得到正确的结果了。 
2、
<script defer> 
Number.prototype.rate=function(){  
var oStr=this.toString(); 
if(oStr.indexOf(".")==-1)  
return 1; 
else 
return Math.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1)); 
} 
function tran(){ 
args=tran.arguments; 
var temp=1; 
for(i=0;i<args.length;i++) 
temp*=args[ i ]*args[ i ].rate(); 
for(i=0;i<args.length;i++)  
temp/=args[ i ].rate(); 
return temp 
} 
alert(tran(11,22.9)); 
</script>

该解决办法是比较麻烦的办法,但是却能让你大概了解解决这个问题的实际过程。

也可以用四舍五入的方法,  js中可以使用Math.round实现整数的四舍五入,如果需要实现精确到小数点多少位则需要编写函数了。

function ForDight(Dight,How) {
   Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How); 
   return Dight; 
}   
//除法函数,用来得到精确的除法结果
//说明: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);
}
//加法函数,用来得到精确的加法结果
//说明: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 相关文章推荐
javascript 面向对象 function类
May 13 Javascript
js 手机号码合法性验证代码集合
Sep 29 Javascript
如何将一个String和多个String值进行比较思路分析
Apr 22 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
JS获取元素多层嵌套思路详解
May 16 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
Jul 07 Javascript
使用JavaScript触发过渡效果的方法
Jan 19 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
Feb 03 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 07 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
node脚手架搭建服务器实现token验证的方法
Jan 20 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 #Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
Jan 03 #Javascript
JS+JSP checkBox 全选具体实现
Jan 02 #Javascript
使用js完成节点的增删改复制等的操作
Jan 02 #Javascript
js实现动态改变字体大小代码
Jan 02 #Javascript
js创建元素(节点)示例
Jan 02 #Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 #Javascript
You might like
PHP4和PHP5共存于一系统
2006/11/17 PHP
最准确的php截取字符串长度函数
2015/10/29 PHP
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
jQuery+ajax实现动态执行脚本的方法
2015/01/27 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
vue+vant实现购物车全选和反选功能
2020/11/17 Vue.js
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
解决python "No module named pip" 的问题
2018/10/13 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
浅析PyTorch中nn.Module的使用
2019/08/18 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
高校辅导员推荐信范文
2013/12/25 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
承诺函格式模板
2015/01/21 职场文书
部队个人年终总结
2015/03/02 职场文书
同事离别感言
2015/08/04 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书