Foros del Web » Creando para Internet » Flash y Actionscript »

Función Numérica

Estas en el tema de Función Numérica en el foro de Flash y Actionscript en Foros del Web. Estimados: Estoy trabajando en la programación de una película Flash, en la cual realizo cálculos matemáticos. En algunas ocaciones estos calculos pueden llegar a ser ...
  #1 (permalink)  
Antiguo 31/05/2006, 11:25
Avatar de ramoncito  
Fecha de Ingreso: febrero-2003
Ubicación: Viña del Mar
Mensajes: 224
Antigüedad: 14 años, 9 meses
Puntos: 10
Función Numérica

Estimados:

Estoy trabajando en la programación de una película Flash, en la cual realizo cálculos matemáticos.

En algunas ocaciones estos calculos pueden llegar a ser :
9.5367431640625e-7

El problema de esto, es que no he encontrado la forma de estandarizar que sólo me muestre 7 decimales por ejemplo, no he encontrado una función incorporada de flash que realice ese cálculo, por lo mismo habia desarrollado mi propia función en action script, la cual adjunto al presente foro.

Código:
function dec(cadena){

// Lo he hecho para verificar la función number y probar la función .toString y .valueO

var verificar = new Number(cadena);
	
if(verificar<Number("0.0000")){
	trace("CadenaV=" + cadena);
	cadena=0;
} else {
	trace("CadenaF=" + cadena);
}

// Traspaso la cadena de números (0.0005015) a String, para tener acceso a la función lenght
// y a la función charAt();


cad=new String(cadena);


for(i=0;i<cad.length;i++){
	if(cad.charAt(i)=="."||cad.charAt(i)==","){
	// Si encuentro un . o una , significa que es decimal y por lo mismo devuelvo cinco posiciones desde el 0. hacia adelante.

		if(cadena<1&&cadena>0){
			// Si es decimal positivo
			return parseFloat(cad.substr(0,i+5));
		} else {
			return parseFloat(cad.substr(0,i+5));
		}
	}
}	

// En caso contrario, que no tenga un . o una , significa que es un entero y devuelvo la cadena completa.

return cad;
}
El Problema aparece cuando salen los valores como este 9.5367431640625e-7, ya que son mayores que 0 y menores que 1 y mi pobre función devuelve el valor 9.53674 (por ejemplo) lo cual es interpretado por el usuario como 9.563674 y no pueden creer el resultado tan grande, ya que el real es como 0.00009563674.

mi pregunta es, alguien conoce alguna forma de que los números que contengan exponentes se resuelvan y no queden como expotencial.

o conoce alguna función que de formato numérico en flash??

espero no molestar.

Saludos!
__________________
:pensando: Ramon Martinez... Chile :adios:
  #2 (permalink)  
Antiguo 01/06/2006, 11:38
Avatar de luistar  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 939
Antigüedad: 12 años, 9 meses
Puntos: 0
hola
pues teneís razón, no he encontrado algo como eso entre las funciones o métodos nativos en ActionScript
pero con los métodos matemáticos que posee se puede armar una función de manera sencilla
sólo que me topé con un gran inconveniente cuando me propuse hacerlo:
ActionScript no trabaja bien con decimales, basta con ver este ejemplo:
Código:
var num:Number = 0;
for(var n=0;n<10;n++) num += 0.1;
trace('El valor de num es '+num);
if(numeroA==1)
	trace('El valor de num es 1');
else
	trace('El valor de num NO es 1');
//------------------------>
trace(10.1-10);
lo que me trabó en varios procesos
por ello, hay que trabajarlos a veces como cadenas, un tanto más engorroso
pero finalmente creo que conseguí el comentido
para ello se tuvo que independizar algunos procesos, por cierto podrían resultar últiles en algunas situaciones

este es el código sin comentarios: (espero no tenga falencias xD)
Código:
var rellenarCadena:Function = function(cadena:String,limite:Number,caracteres_relleno:String,posicion:Boolean):String{
	if(cadena.length>=limite) return cadena;
	while(cadena.length<limite) if(posicion) cadena = caracteres_relleno+cadena; else cadena += caracteres_relleno;
	return cadena;
}
var float2dec:Function = function(numero:Number):String{
	var numero_str:String = String(numero);
	if(numero_str.indexOf('e') == -1) return numero_str;
	var posicion_decimal:Number = numero_str.indexOf('.');
	var parte_entera:String = posicion_decimal!=-1?numero_str.split('.')[0]:numero_str.split('e')[0];
	var parte_decimal:String = posicion_decimal!=-1?numero_str.substr(posicion_decimal+1,numero_str.indexOf('e')-posicion_decimal-1):'';
	var exponente:Number = Number(numero_str.split('e')[1]);
	var tmp1:String = exponente>0?parte_decimal:parte_entera;
	var tmp2:String = rellenarCadena(tmp1,Math.abs(exponente)+tmp1.length,'0',exponente<0);
	var tmp3:String = exponente>0?parte_entera+tmp2:tmp2.substr(0,1)+'.'+tmp2.substr(1)+parte_decimal;
	return tmp3;
}
var redondear:Function = function(numero:Number,limit_decimales:Number):Number{
	var numero_str:String = float2dec(numero);
	var posicion_decimal:Number = numero_str.indexOf('.');
	if(posicion_decimal==-1) return numero;
	var parte_decimal:Number = Number(numero_str.substr(posicion_decimal+1));
	var cant_decimales:Number = String(parte_decimal).length;
	if(cant_decimales<=limit_decimales) return numero;
	var tmp1:Number = Math.round(numero*Math.pow(10,limit_decimales));
	var tmp2:Number = tmp1/Math.pow(10,limit_decimales);
	return tmp2;
}

trace("EJEMPLOS: redondear\n----------------------------------------------------");
trace(redondear(12.451654,1));
trace(redondear(45.117214,2));
var numE:Number = 9.5367431640625e-7;
trace(numE+' -> '+redondear(numE,8)+' -> '+float2dec(redondear(numE,8)));
var numF:Number = 9.5367431640625e-3;
trace(numF+' -> '+redondear(numF,5)+' -> '+float2dec(redondear(numF,5)));

stop();
es sólo entender cómo ActionScript interpreta ciertos números
si quieres ver cómo funciona cada función xD
aquí está el código con los comentarios y ejemplos pertinentes, solo copia el contenido en un nuevo doc flash

:D
__________________
Si digo que soy mentiroso. ¿Lo soy?

Última edición por luistar; 01/06/2006 a las 11:44
  #3 (permalink)  
Antiguo 02/06/2006, 10:26
Avatar de ramoncito  
Fecha de Ingreso: febrero-2003
Ubicación: Viña del Mar
Mensajes: 224
Antigüedad: 14 años, 9 meses
Puntos: 10
Estimado...

Muchas gracias por la ayuda, espero aplicar la función y contar mi experiencia para ver si podemos sacar algo bueno o algo malo de aquella y mejorar esta función.

Por el momento sólo me queda agradecer tu colaboración y muuchas gracias.
__________________
:pensando: Ramon Martinez... Chile :adios:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:03.