javascript浮点数计算的bug
来源:asp之家 发布时间:2009-12-06 11:43:00
js浮点数计算有时是不准确的,比如7*0.8 == 7*8/10的值为false,因为7*0.8=5.6000000000000005,乘出了误差。这种误差出现的概率有多少呢?写个demo瞅瞅,计算i/10*100 == i*10,i从2000自增到12000,整个过程使用200毫秒左右。所有标红的记录都是计算结果有误差的情况。总共执行乘法20000次,除法10000次.
demo:http://www.uedmagazine.com/test/js_float_1.html
给Number增加三个计算浮点数的方法,乘法、加法、除法,减法和加法一样:
Number.prototype.div = function(arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this/arg;
}
var arg1 = this;
var arg2 = arg;
var t1=0,t2=0,r1,r2,s1=arg1.toString(),s2=arg1.toString();
if(s1.indexOf('.')>=0)t1 = s1.split(".")[1].length;
if(s2.indexOf('.')>=0)t2 = s2.split(".")[1].length;
r1=Number(s1.replace('.',''))
r2=Number(s2.replace('.',''))
return (r1/r2)*Math.pow(10,t2-t1);
};
//乘法
Number.prototype.mul = function (arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this*arg;
}
var arg1 = this;
var arg2 = arg;
var m=0,s1=arg1.toString(),s2=arg2.toString();
if(s1.indexOf('.')>=0)m+=s1.split(".")[1].length;
if(s2.indexOf('.')>=0)m+=s2.split(".")[1].length;
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
};
//加法
Number.prototype.add = function (arg){
if(!/\./.test(this) && !/\./.test(arg)){
return this+arg;
}
var arg2 = this;
var arg1 = arg;
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;
};
hack后的demo:http://www.uedmagazine.com/test/js_float_2.html
hack后的总执行时间大概是400毫秒左右,实际执行情况视客户端机器情况,一般而言比原生乘除慢一倍时间,不过也是可容忍的。
ps:有时对算法效率有要求的时候,多使用判断和存储,用简单语句代替长难句,原则无非是用空间换时间,以赢得更快的速度。以上。
猜你喜欢
- Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能。 一、启动和关闭O
- 一般情况下,访问或设置剪贴板,IE 只需使用 window.clipboardData 的 getData 或 setData 方法即可。M
- Office家族成员中,人们对于Access 2000的了解,往往只局限在它的操作界面中,对于数据库管理的功能仍只是停留在建立表、数据输入、
- Asp开发 联通CDMA以下是在开发wap中的随笔,其中一些对于“老鸟”来说,谈不上什么,希望对初学者有所帮助,大家有什么小技巧,欢迎顶上来
- Dump ALL MySQL Databasesmysqldump --user=XXXXXXXX --password=XXXXXXX -
- 摘要: Portal是IT领域的新技术,是企业信息化工作的发展方向之一。本文首先介绍了Oracle Portal的定义、特点,接着阐述了po
- 参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2操作系统:Windows蓝色理想
- 后台数据库: [Microsoft Access] 与 [Microsoft Sql Server] 更换之后,ASP代码应注意要修改的一些
- MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我在开发一个P2P应用的时候曾经使用MySQL来保存P2P节点,由
- 似乎讨论分页的人很少,难道大家都沉迷于limit m,n?在有索引的情况下,limit m,n速度足够,可是在复杂条件搜索时,where s
- 自从SQL Server 2005推出后,因为有了更好的性能,所以有很多与SQL Server 2000相关的应用程序需要升级到这个版本。但
- 设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 Backup Database [数据库] To disk=&
- 最近刚接触了公司的服务器,使用的是Windows 2003 server + IIS 6.0 服务器,在使用无组件上传文件时产生这个错误时:
- 1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表
- 昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB
- 我用FSO生成了unicode的文件,但这不是我想要的。FSO可以生成utf-8格式编码的html文件吗?用什么办法才能生成?FSO的编码问
- VBSCRIPT中的日期,时间,星期函数很丰富,给我们使用带来了很大的方便,我个人使用最多的就是用now()来获取服务器的当前日期和时间。但
- 下面的代码是日期函数的一些简单运用,应该不用解释,生成当月的日历,当然你可以根据实际情况进行扩充!效果图:<%@LANGUAGE=&q
- 通过HTTP_USER_AGENT判断用户是从手机上访问,还是电脑IE上访问。 asp代码片段:主要使用了正则匹配手机环境,大家可以补充手机
- 数据库设计(Database Design)的概念:数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之