2010-11-27 38 views
0

Il y a quelques jours, j'ai commencé un projet dans lequel je devais faire un certain calcul de mesure; spécifiquement: calcul statistique. Eh bien, ce n'est pas le problème, le problème est venu avec arrondir les nombres flottants (nombres avec des décimales), et la façon dont javascript traite avec elle. J'ai trouvé quelques approches dans l'Internet pour arrondir les numéros javascript, mais aucun d'entre eux n'était une excellente alternative à ce que fait exactement ms excel (fonction ROUND.MAX). Je dois donc recréer ce comportement de fonction par moi-même. Donc, ceci est le code:Fonction de RoundUP comme Microsoft Excel, en Javascript

MathExt = { 

init: function(options){ 
    this.separator = options.separator || ","; 
}, 

roundMax: function(number, decimals){ 
    var $_indexOf = number.lastIndexOf(this.separator); 
    var fp = number.substring(0, $_indexOf); 
    var rp = number.substr($_indexOf + 1); 
    var roundedNumber = ""; 
    if(decimals > 0){ 
    var i = 0; 
    var _pq = 0; 
    var _zeros = ""; 

    while(rp.substr(i++, 1) == "0"){ _zeros += "0"; } 

    i = rp.length - 1; 
    while(i >= decimals){ 
    var _t = rp.charAt(i); 
    rp = rp.substring(0, i); 
    if(_t != "0"){ 
    if(rp.charAt(i - 1) == "9"){ _pq = 1; } 
    else{ 
     if(_pq == 1) _pq = 0; 
     rp = _zeros + (parseInt(rp, 10) + 1) + ""; 
     if(i == _zeros.length) _zeros = _zeros.substr(0, i - 1); 
    } 
    } 
    i--; 
    } 
    if(_pq == 0) 
    roundedNumber = fp + this.separator + rp; 
    else 
    if(i == 0){ 
    roundedNumber = "" + (parseInt(fp) + 1); 
    } 
    else{ 
    rp = (parseInt(rp) + 1) + ""; 
    i = rp.length - 1; 
    while(i > 0 && rp.substr(i, 1) == "0") rp = rp.substr(0, i); 
    roundedNumber = fp + this.separator + rp; 
    } 
    } 
    else{ 
    var _s = rp.substring(0, 1); 
    if(_s != "0") fp = "" + (parseInt(fp) + 1); 
    roundedNumber = fp; 
    } 
    return roundedNumber; 
} 
}; 

Eh bien, ce code fonctionne comme j'ai expiré avec les numéros javascript. mais javascript Surpringly tronquer de longs nombres flottants. Et la prochaine est de faire la même chose, mais avec de très longs nombres. Hier quelqu'un m'a donné un lien que j'ai trouvé très utile, mais. Je veux savoir si cette fonction (ROUND.MAX d'EXCEL) est déjà implémentée pour ce genre de gros nombres flottants.

Voici un exemple:

piii = 3.14159141597; for(var i = 0; i <= 11; i++){ console.log((Math.round((piii*Math.pow(10, i)))/Math.pow(10,i))); } extracted this from internet. 
3 
3.1 
3.14 
3.142 
3.1416 
3.14159 
3.141591 
3.1415914 
3.14159142 
3.141591416 
3.141591416 
3.14159141597 

MS Excel ROUND.MAX FUNCTION 
4 
3,2 
3,15 
3,142 
3,1416 
3,1416 
3,141592 
3,1415915 
3,14159142 
3,141591416 
3,141591416 
3,14159141597 

My first version of the ROUND.MAX algorithm 
4 
3.2 
3.15 
3.142 
3.1416 
3.1416 
3.141592 
3.1415915 
3.14159142 
3.141591416 
3.141591416 
3.14159141597 
+1

Représentez-vous les numéros que cordes? – thejh

+0

Eh bien, en principe, toutes les données sont stockées dans SQLServer, et les champs qui stockent les informations sont du texte. Donc, l'entrée est du texte, à droite. – crsuarezf

+0

Par exemple: Il y a des valeurs telles que: 3,5 et 3,5 note le (point et virgule) Il y a également des valeurs comme: 3,56246323457213471283904712839047128930423074891203748129037481290347812903471823904712839047128930471283904718 note le (grand nombre) les valeur sont inmediatly tronquée en javascript, et je ne Je veux gaspiller le temps du serveur et le processeur dans ces calculs, parce que j'utilise le serveur comme une simple interface CRUD, donc tout le calcul est fait dans le client avec javascript. – crsuarezf

Répondre

1

Il suffit de remplacer round avec ceil dans votre exemple pour obtenir l'effet roundmax:

piii = 3.14159141597; 
for(var i = 0; i <= 11; i++) { 
    console.log((Math.ceil((piii*Math.pow(10, i)))/Math.pow(10,i))); 
} 

sortie:

4 
3.2 
3.15 
3.142 
3.1416 
3.1416 
3.141592 
3.1415915 
3.14159142 
3.141591416 
3.141591416 
3.14159141597 
+0

tnx, mais j'ai dû implémenter à nouveau les deux fonctions dans une classe BigInteger Javascript. – crsuarezf