日期:2014-05-16 浏览次数:20493 次
????? 这里用一个小技巧:|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的数值计算会出现另外一个不准确的结果。
我是用在超长的流水号上,希望这个能对你有用。
?
?