j'espère qu'avec ça, j'aurai droit à ma place dans les "sources js" ? 
voici une version un peu plus compacte (1.2ko)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function calc(expression,v,i){
function add(n1,n2){
var i,len1,len2,len = Math.max(len1=((i= n1.toString().split('.')[1])?i.length:0),len2=((i = n2.toString().split('.')[1])?i.length:0)),zero = '0';
for(i=1;i<len;i*=2) zero += zero;
var result = (parseInt(n1.toString().replace('.',''),10)*Math.pow(10,len-len1)+parseInt(n2.toString().replace('.',''),10)*Math.pow(10,len-len2)).toString();
result = (Number(result)<0)?('-'+zero+result.substring(1,result.length)):(zero+result);
return Number(result.substr(0,result.length-len)+'.'+result.substr(result.length-len,result.length));
}
function multi(n1,n2){
var i,len = ((i = n1.toString().split('.')[1])?i.length:0) + ((i = n2.toString().split('.')[1])?i.length:0),zero = '0';
for(i=1;i<=len;i*=2) zero += zero;
var result = (parseInt(n1.toString().replace('.',''),10)*parseInt(n2.toString().replace('.',''),10)).toString();
result = Number(result)<0?'-'+zero+result.substring(1,result.length):zero+result;
return Number(result.substr(0,result.length-len)+'.'+result.substr(result.length-len,result.length));
}
while(expression != (expression = expression.replace(/\([^\(\)]*\)/,function(a){ var r=calc(a.slice(1,a.length-1));return r;})));
if((v = expression.split('+')).length>1 && !(expression = 0)){
for(i=0;i<v.length;i++)
expression = add(expression,calc(v[i]));
}
if((v = expression.toString().split('*')).length>1 && (expression = 1)){
for(i=0;i<v.length;i++)
expression = multi(expression,calc(v[i]));
}
return eval(expression);
} |
et la version compressée (1ko) :
function calc(b,v,i){function y(a,b){var d,i,e,f,g=Math.max(e=((i=a.toString().split('.')[1])?i.length:0),f=((i=b.toString().split('.')[1])?i.length:0)),z="0";for(i=1;i<g;i*=2)z+=z;d=(parseInt(a.toString().replace('.',''),10)*Math.pow(10,g-e)+parseInt(b.toString().replace('.',''),10)*Math.pow(10,g-f)).toString();d=(Number(d)<0)?('-'+z+d.substring(1,d.length)):(z+d);return Number(d.substr(0,d.length-g)+'.'+d.substr(d.length-g,d.length))}function x(a,b){var d,i,g=((i=a.toString().split('.')[1])?i.length:0)+((i=b.toString().split('.')[1])?i.length:0),z="0";for(i=1;i<=g;i*=2)z+=z;d=(parseInt(a.toString().replace('.',''),10)*parseInt(b.toString().replace('.',''),10)).toString();d=Number(d)<0?'-'+z+d.substring(1,d.length):z+d;return Number(d.substr(0,d.length-g)+'.'+d.substr(d.length-g,d.length))}while(b!=(b=b.replace(/\([^\(\)]*\)/,function(a){return calc(a.slice(1,a.length-1))})));if((v=b.split('+')).length>1&&!(b=0))for(i=0;i<v.length;i++)b=y(b,calc(v[i]));if((v=b.toString().split('*')).length>1&&(b=1))for(i=0;i<v.length;i++)b=x(b,calc(v[i]));return eval(b)}
et la version "packed" (0.9 ko):
eval(function(a,c){return a.replace(new RegExp('\\b\\d+\\b','g'),function(x){return c[x]||x})}("4 5(b,v,i){4 y(a,b){var d,i,e,f,g=6.max(e=((i=a.7().8('.')[1])?i.9:0),f=((i=b.7().8('.')[1])?i.9:0)),z='0';10(i=1;i<g;i*=2)z+=z;d=(11(a.7().12('.',''),3)*6.pow(3,g-e)+11(b.7().12('.',''),3)*6.pow(3,g-f)).7();d=(13(d)<0)?('-'+z+d.14(1,d.9)):(z+d);15 13(d.16(0,d.9-g)+'.'+d.16(d.9-g,d.9))}4 x(a,b){var d,i,g=((i=a.7().8('.')[1])?i.9:0)+((i=b.7().8('.')[1])?i.9:0),z='0';10(i=1;i<=g;i*=2)z+=z;d=(11(a.7().12('.',''),3)*11(b.7().12('.',''),3)).7();d=13(d)<0?'-'+z+d.14(1,d.9):z+d;15 13(d.16(0,d.9-g)+'.'+d.16(d.9-g,d.9))}while(b!=(b=b.12(/\\([^\\(\\)]*\\)/,4(a){15 5(a.slice(1,a.9-1))})));if((v=b.8('+')).9>1&&!(b=0))10(i=0;i<v.9;i++)b=y(b,5(v[i]));if((v=b.7().8('*')).9>1&&(b=1))10(i=0;i<v.9;i++)b=x(b,5(v[i]));15 eval(b)}",'0|1|2|10|function|calc|Math|toString|split|length|for|parseInt|replace|Number|substring|return|substr'.split('|')));

nb: ma version compressée possède 3 variables locales "b" et "v" et "i", évitez donc les appels du genre :
1 2
| var b=2, v=3;
calc('b+v'); |
et préférez :
1 2
| var b=2, v=3;
calc('self.b+self.v'); |
ou encore
1 2
| var b=2, v=3;
calc(b+'+'+v); |
ou plus simplement évitez de nommer vos variables "b" et "v" et "i" lors des appels à la fonction calc. 
edit: nouvelle erreur des négatif corrigée !
Partager