解决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 相关文章推荐
用jQuery简化JavaScript开发分析
Feb 19 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
Javascript 八进制转义字符(8进制)
Apr 08 Javascript
Jquery倒数计时按钮setTimeout的实例代码
Jul 04 Javascript
js实现文本框输入文字个数限制代码
Dec 25 Javascript
Angularjs中UI Router全攻略
Jan 29 Javascript
原生JS实现图片轮播与淡入效果的简单实例
Aug 21 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
Nov 25 Javascript
Three.js的使用及绘制基础3D图形详解
Apr 27 Javascript
vue-router单页面路由
Jun 17 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
浅析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
PHP初学者头疼问题总结
2006/10/09 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
js 匿名调用实现代码
2009/06/19 Javascript
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
详解vue axios中文文档
2017/09/12 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
vue生命周期的探索
2019/04/03 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
利用Python破解斗地主残局详解
2017/06/30 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
中学生团员自我评价分享
2013/12/07 职场文书
组织关系转移介绍信
2014/01/16 职场文书
奥巴马连任演讲稿
2014/05/15 职场文书
机电一体化专业求职信
2014/07/22 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers