解决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 写类方式之十
Jul 05 Javascript
基于jquery的tab切换 js原理
Apr 01 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
Jan 17 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
JS基于面向对象实现的拖拽库实例
Sep 24 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
Jul 22 jQuery
vue中使用localstorage来存储页面信息
Nov 04 Javascript
Javascript异步编程async实现过程详解
Apr 02 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
用javascript实现倒计时效果
Feb 09 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
Home Coffee Roasting
2021/03/03 咖啡文化
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
PHP7变量处理机制修改
2021/03/09 PHP
超清晰的document对象详解
2007/02/27 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
深入理解js promise chain
2016/05/05 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
Vue中render函数的使用方法
2018/01/31 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python中属性和描述符的正确使用
2016/08/23 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
Python决策树分类算法学习
2017/12/22 Python
python中的变量如何开辟内存
2018/06/26 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
法制宣传口号
2014/06/16 职场文书
检察院院长群众路线教育实践活动个人整改措施
2014/10/04 职场文书
电影地道战观后感
2015/06/04 职场文书
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js