日期:2014-05-16  浏览次数:20393 次

JavaScript的大数加法、乘法和乘方

????? 这里用一个小技巧:|0默认转为数值并取整,因为p和q可能长度不同,有可能会出现p[i]或q[j]成为undefined,|0比parseInt更强,可以自动将undefined的值转为0,这样就不用判断p[i]或q[j]是否为数值了。


????? 可以将/\d{1,N}/g改成N位一次运算,默认是4位一次。

?

?

function bigNumMulti(a,b){
    var p = a.match(/\d{1,4}/g).reverse();
    var q = b.match(/\d{1,4}/g).reverse();
    var f1 = 0;
    var result = "0";
 
    for(var i = 0; i < p.length; i++){
        var f2 = 0;
        for(var j = 0; j < q.length; j++){
            var t = (p[i]|0)*(q[j]|0);
            t += new Array(f1+f2+1).join("0");
            result = bigNumAdd(result, t);
            f2 += q[j].length;
        }
        f1 += p[i].length;
    }
    return result;
}
function bigNumAdd(a,b){
    var m = a.split('').reverse();
    var n = b.split('').reverse();
    var ret = [];
    var s = 0;
 
    for(var i = 0; i < a.length || i < b.length; i++){
        var t = (m[i]|0) + (n[i]|0) + s;
 
        ret.push(t%10);
        s = (t/10)|0;
    }
    if(s){
        ret.push(s);
    }
    return ret.reverse().join('');
}
 
function bigNumPow(a,b){
    var ret = "1";
    for(var i = 0; i < b; i++){
        ret = bigNumMulti(ret,a.toString());
    }
    return ret;
}
document.write("2的4次方="+bigNumPow(2,4));
document.write("<br>");
document.write("4-2="+bigNumMulti("4","2"));
document.write("<br>");
document.write("2+4="+bigNumAdd("2","4"));

? ?2的4次方=16
?? 4-2=8
?? 2+4=6

?

这不是太的好处,它真正的用途是document.write(bigNumAdd("111111112222222211","111111112222222211"));

得出的结果是222222224444444422。如果用JavaScript的数值计算会出现另外一个不准确的结果。

我是用在超长的流水号上,希望这个能对你有用。

?

?