Comunidad de diseño web y desarrollo en internet online

Redondeo de decimales en numeros exponenciales

Citar            
MensajeEscrito el 25 Oct 2005 09:48 pm
estoy teniendo unos problemas....
basicamente se trata de que en ocasiones (no siempre) en una aplicacion de e-learning enfocada a fisica obtengo datos exponenciales en Flash tipo :

Código :

5.58450114180809e+20


Sucede que por los requerimientos de la aplicacion se necesita en este formato :

Código :

5.584e+20


Me refiero a que unicamente en tres decimales a x numero exponencial. Tratando de hacer una operacion tan basica como:

Código :

Math.round(5.58450114180809e+20*1000)/1000


Devuelve el mismo numero

Código :

5.58450114180809e+20


Quisiera ver si hay una forma elegante de hacerlo sin tener que convertir el numero a un string o alguna libreria especial de Math. La unica forma que se me ocurre ahora es haciendo una validacion de que si el numero es superior a 99999999999999 y despues hacer unos splices con el numero transformado en string y finalmente devolverlo a numerico (la forma no elegante que no quiero).

Saludos!

Por tangamampilia

.GAIA Developer

961 de clabLevel


6 articulos

Genero:Masculino   Anime Bloggers

México, D.F.

safari
Citar            
MensajeEscrito el 26 Oct 2005 02:02 am
Si, tendrías que emular el metodo Math.round(:sigh:), ya que con números grandes, los métodos de Math, no funcionan. Pero las operaciones aritméticas básicas, si que funcionan.

Ahora bien, yo hice una función(ahorita por que no encuentro la que tenía para eso), que convierte a string, y que creo no consume grandes recursos. Ya que solo si es necesario, el numero se procesa como string, se corta y queda listo, no se convierte varias veces, no se si te sirva:

Código :

function redondeaExp(valor:Number):Number{
   var NumeroStr:String = valor.toString();
   Tamaño=NumeroStr.indexOf("e");
   var Decimales:Number=Number(NumeroStr.substr(Tamaño+2));
   if(Tamaño > 5){
      NumeroStr=NumeroStr.substr(0,5);
      Decimales+=Tamaño-5;
      valor = Number(NumeroStr)*Math.pow(10,Decimales);
   }
   return valor;
}
Numero=1235632132132135456454645654564564545645645464;
trace(Numero);
trace(redondeaExp(Numero));


Esa función puede ser el método de una clase que extienda a Number.

Saludos :crap:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

clabbrowser
Citar            
MensajeEscrito el 26 Oct 2005 02:02 pm
Ummm ... si , lo de Dano me parece la mejor opcion aunque podria ser mucho más facil , recuerda que solo es la representación no el numero en si lo que necesitas redondear, por lo que podria devolver un String en vez de un numero ... si ya se lo que estais pensando, que quizas le interesen hacer calculos con los numeros truncados ... pero eso es tan brutal e inconsciente!! jajajaja

por otra parte te podria servir la clase DecimalFormat y DecimalFormatSymbols de JAVA, yo estaba por portar alguno de sus metodos a AS, lo que pasa que no encuentro tiempo, pero bueno... miralo por si acaso, esta en el paquete java.text

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 31 Oct 2005 05:32 pm
Mas bien deberia ser un metodo que extienda a la clase Math. Basicamente como lo tienes Dano era como lo habia pensado. Afortunadamente el calculo no lo tengo que hacer mas que 4 veces por seccion, asi que no es muy intensivo. De igual manera buscare el paquete que menciona el iceman por si encuentro algo interesante.

saludos!

Por tangamampilia

.GAIA Developer

961 de clabLevel


6 articulos

Genero:Masculino   Anime Bloggers

México, D.F.

safari
Citar            
MensajeEscrito el 07 Dic 2005 11:46 pm
bueno, basicamente quedo asi al final :

Código :

class MathPlus extends Math {
   //
   //
   function MathPlus() {
   }
   //
   static function round(nData:Number, nCount:Number):Number {
      var nLimit:Number = nCount;
      var nValue:Number = nData;
      var strNumber:String = nValue.toString();
      var arrData:Array = strNumber.split(".");
      if (arrData.length == 2) {
         var arrExp:Array = arrData[1].split("e");
         if (arrExp.length == 2) {
            var nLenghtDecimal:Number = arrExp[0].length;
            var nDivide = nLenghtDecimal>nLimit ? 10000 : 1;
            var nDecimal:Number = MathPlus.round(Number(arrData[0]+"."+arrExp[0])*nDivide)/nDivide;
            var nFinal:Number = Number(nDecimal+"e"+arrExp[1]);
            return nFinal;
         } else {
            var nLenghtDecimal:Number = arrExp[0].length;
            var nDivide = nLenghtDecimal>nLimit ? 10000 : 1;
            var nDecimal:Number = MathPlus.round(Number(arrData[0]+"."+arrExp[0])*nDivide)/nDivide;
            var nFinal:Number = Number(nDecimal);
            return nFinal;
         }
      } else {
         var nFinal:Number = nValue;
         return nFinal;
      }
   }
}

Por tangamampilia

.GAIA Developer

961 de clabLevel


6 articulos

Genero:Masculino   Anime Bloggers

México, D.F.

safari

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.