解决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动画效果类封装代码
Aug 28 Javascript
js 跨域和ajax 跨域问题小结
Jul 01 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
js 数值转换为3位逗号分隔的示例代码
Feb 19 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
Sep 24 Javascript
Javascript自定义事件详解
Jan 13 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
Feb 21 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
小文件php+SQLite存储方案
2010/09/04 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
php构造函数与析构函数
2016/04/23 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
Open and Print a Word Document
2007/06/15 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
《从现在开始》教学反思
2014/04/15 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书