网络编程
位置:首页>> 网络编程>> JavaScript>> javascript浮点数计算的bug

javascript浮点数计算的bug

 来源:asp之家 发布时间:2009-12-06 11:43:00 

标签:浮点,计算,bug,JavaScript

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:有时对算法效率有要求的时候,多使用判断和存储,用简单语句代替长难句,原则无非是用空间换时间,以赢得更快的速度。以上。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com