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
Représentez-vous les numéros que cordes? – thejh
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
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