解决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 相关文章推荐
[HTML/CSS/Javascript]WWTJS
Sep 25 Javascript
JavaScript中用字面量创建对象介绍
Dec 31 Javascript
论JavaScript模块化编程
Mar 07 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
JS简单随机数生成方法
Sep 05 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
bootstrap table操作技巧分享
Feb 15 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
浅谈JsonObject中的key-value数据解析排序问题
Dec 06 Javascript
从零开始搭建一个react项目开发
Feb 09 Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php正则
2006/07/07 PHP
给多个地址发邮件的类
2006/10/09 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
书单|人生苦短,你还不用python!
2017/12/29 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
创先争优活动方案
2014/02/12 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
小学清明节活动总结
2014/07/04 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
功夫熊猫观后感
2015/06/10 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
个人道歉信大全
2019/04/11 职场文书
python中urllib包的网络请求教程
2022/04/19 Python
python区块链持久化和命令行接口实现简版
2022/05/25 Python