相濡以沫

鱼遇于池,池涸,相濡以沫,相鞠以湿,不若相忘于海。(爱技术、爱时尚)

用户操作
[即时聊天] [发私信] [加为好友]
挨踢老人ID:onlyzhangqin
2562967次访问,排名2好友237人,关注者546
大便的离去是马桶的招唤,还是肛门的不挽留?
onlyzhangqin的文章
原创 663 篇
翻译 11 篇
转载 17872 篇
评论 228 篇
挨踢老人的公告
点我聊QQ
最近评论
goodman1999:10pig.cn可以打包下载Sourceforge上的开源项目,把7万多个开源项目,按主题和编程语言打成2000多个ISO镜像文件,省去按单个文件下载的烦恼,也可以刻录成DVD盘邮寄,非常方便。
lv_ping:"朋友之交淡如水"?好像是"君子之交淡如水吧"!
wanxuesi:能不能给份源码啊?先谢了
邮箱:wanxuesi@163.com
wanxuesi:能不能给份源码啊?先谢了
邮箱:wanxuesi@163.com
shufangxieyang:我就是看脚来控制的
想象她的脚是顺时针转她就顺时针转
想象成逆时针她就逆时针转
但我第一眼看上去是顺时针的
而且从逆到顺要比从顺到逆好控制
文章分类
收藏
相册
超女里不多的美女
都是美女
好看好玩
著名的照片
技术
Cisco网络技术(Net130.Com)
CSS在线编辑
DotNet男孩社区
IP查询
Sunmoonfire's artistic matrix
UML软件工程组织
一个好博客(RSS)
中国协议分析网
中国项目管理网
微软帮助和支持
朋友
又一个好博客(RSS)
小人鱼的秘密
我的站长天下
其它
AC MILAN官网
Badged
deshow 在线制作服务
E书下载
IT公司速查手册
msn在线留言
Slide
Webfetti
东方资源
中华电脑书库
博客网址价值评估工具
我爱e书
我的下载Blog
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 javascript中浮点计算精度问题。收藏

新一篇: 一个简单的XML for J2ME。 | 旧一篇: 让进程在后台可靠运行的几种方法。


淘宝书店:http://shop35357269.taobao.com


javascript中浮点计算精度问题
javascript中浮点计算精度问题,
1.26*7.78/7.78 /0.8 = 1.57499999999999999997
因为在javascript中计算出来是这个值。
与原本的计算值1.575不等
<script type="text/javascript">
alert(1.26*7.78/7.78/0.8);
</script>
但是vbscript计算是正确的<script language="VBScript">alert(1.26*7.78/7.78/0.8)</script>
以下是在网上找到的一些方法,但似乎不能解决问题.
-------------------------------------------------------------------

问题这样的:
37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)
我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
比如:7*0.8 JavaScript算出来就是:5.6000000000000005
网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码


//除法函数,用来得到精确的除法结果
//说明: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);
}


在你要用的地方包含这些函数,然后调用它来计算就可以了。
比如你要计算:7*0.8 ,则改成 (7).mul(8)
其它运算类似,就可以得到比较精确的结果。

------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是在网上一个JS牛人的博客上转载的,不过上面只提及了加法、乘法和除法的解决办法。
这个时候可能很多人就会想,有了加法,减法还不容易?我就是差点让这个想法给害苦了。
其他的就不多说了,
帖出减法的代码:


function Subtr(arg1,arg2){
     var r1,r2,m,n;
     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));
     //last modify by deeka
     //动态控制精度长度
     n=(r1>=r2)?r1:r2;
     return ((arg1*m-arg2*m)/m).toFixed(n);
}


发表于 @ 2008年05月29日 21:59:42|评论(loading...)|编辑

新一篇: 一个简单的XML for J2ME。 | 旧一篇: 让进程在后台可靠运行的几种方法。

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 挨踢老人