Comunidad de diseño web y desarrollo en internet online

calculadora en actionScript

Citar            
MensajeEscrito el 08 Feb 2006 06:25 am
hola, necesito si alguien tiene el codigo de una claculadora con las funciones basicas o sea +, -, *, / en actionScript me la envie, el problema radica a la hora de sumar y multiplicar numeros de mas de 15 digitos pues no puedo usar el tipo de datos Number pues usa otra notacion que no es la decimal.
Saludos Darht_Vader

Por Darth_Vader

1 de clabLevel



Genero:Masculino  

msie
Citar            
MensajeEscrito el 08 Feb 2006 08:11 am
Hola

Si, es verdad, los representa en notacion cientifica...

Aca te dejo la funcion para la suma, basicamente lo q hace es completar con ceros el numero mas chico y luego hace los mismos pasos q cuadno sumamos manualmente

Código :

a = "123456789012345";
b = "65";
function sumar(a, b) {
   //completo con 0 el numero mas chico
   if (a.length>b.length) {
      c = a.length-b.length;
      for (i=0; i<c; i++) {
         b = "0"+b;
      }
   } else {
      c = b.length-a.length;
      for (i=0; i<c; i++) {
         a = "0"+a;
      }
   }
   //convierto a matriz y lo doy vuelta
   b = b.split("");
   a = a.split("");
   a.reverse();
   b.reverse();
   total = "";
   pasa = 0;
   //sumo posicion a posicion
   for (i=0; i<a.length; i++) {
      trace("-------");
      sum = Number(a[i])+Number(b[i]);
      sum += pasa;
      trace(a[i]+"+"+b[i]+"+"+pasa+"="+sum);
      div = String(sum/10);
      trace("div:"+div);
      punto = div.indexOf(".", 0);
      trace("punto:"+punto);
      queda = (punto != -1)?div.substring(punto+1):"0";
      trace("queda:"+queda);
      pasar = (punto != -1)?Number(div.substring(0, punto)):1;
      pasa = (isNaN(pasar)) ? 0 : pasar;
      trace("pasa:"+pasa);
      total = queda.toString()+total;
      trace("subtotal:"+total);
   }
   trace("--------salio------------");
   trace("total:"+total);
   return total;
}
trace(sumar(a, b));



Para el resto de las operaciones es simplemente hacer paso por paso cada accion q se realiza talcual lo hace esta funcion con la operacion suma

Espero q te sirva

saludos!

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox
Citar            
MensajeEscrito el 08 Feb 2006 08:50 am
haciendo un casting a Number de los números científicos CREO que no debería de dar problema...

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 03 May 2007 02:23 am
podrias publicar el fla de este archivo, ya que e manda errores en estos codigos
//sumo posicion a posicion
for (i=0; i<a.length; i++) {
trace("-------");
sum = Number(a[i])+Number(b[i]);
sum += pasa;
trace(a[i]+"+"+b[i]+"+"+pasa+"="+sum);
div = String(sum/10);
trace("div:"+div);
punto = div.indexOf(".", 0);
trace("punto:"+punto);
queda = (punto != -1)?div.substring(punto+1):"0";
trace("queda:"+queda);
pasar = (punto != -1)?Number(div.substring(0, punto)):1;
pasa = (isNaN(pasar)) ? 0 : pasar;
trace("pasa:"+pasa);
total = queda.toString()+total;
trace("subtotal:"+total);

Por mario507_1

4 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 Oct 2010 06:51 pm
Buenas gentes, estuve observando el POST y solo llegamos a hacer una simple suma pero no una calculadora para números grandes. Entendí perfectamente el código y por lo que veo, solo sirve para ello, de hecho la función se llama "suma", sin embargo, hice un pequeño estudio publicado aquí:

http://foros.cristalab.com/como-operar-con-numeros-de-mas-de-15-digitos-t91570/#571739

Este tema que abriera fue mayoritariamente porque esto era para una calculadora y no me servía inicialmente, pero luego comprendí que ciertas partes de la misma sí me servían, pero claro, como uso potencias, necesito la solución de pasar el error de sobre pasar los bits por número. Me explico:

El error sucede porque Flash trabaja con números comprendidos entre Math.pow(-2,49)=-562949953421312 y Math.pow(2,49)=562949953421312. Cuando se excede uno de estos dos valores en una potencia excede el número de lench permitidos, por tanto llegamos a la conclusión que el problema de flash es que trabaja a 8bits (Math.pow(2,8)=16 o lo que sería lo mismo: String(Number(xxxxxxxx)).length<16) en dígitos numéricos, y cuando se excede esto, Flash recurre al redondeo, lo cual llama error, y lo expone a una potencia, por tanto, un número entero no puede exceder de 999999999999999 ni de -999999999999999 y un número decimal positivo no puede ser mayor que 999999999999999 ni menor 0.000000000000001.

La cosa sería hacer trabajar a Flash a 16 bits o más para ampliar este límite.

Ampliando mi experimento del otro sitio, llego a la siguiente comprobación:

Código ActionScript :

stop();
var i:Array=new Array();
i[0]=64;
for(i[1]=0;i[1]<i[0];i[1]++){
   trace(i[1]+"bits = "+Math.pow(2,i[1])" = "+Math.pow(10,i[1]));
};

Pero problema inmediato, llego a otra conclusión, Flash trabaja con 14 dígitos. Cada vez entiendo menos el sistema numérico de Flash. Mirar el resultado:

0bits = 1 = 1
1bits = 2 = 10
2bits = 4 = 100
3bits = 8 = 1000
4bits = 16 = 10000
5bits = 32 = 100000
6bits = 64 = 1000000
7bits = 128 = 10000000
8bits = 256 = 100000000
9bits = 512 = 1000000000
10bits = 1024 = 10000000000
11bits = 2048 = 100000000000
12bits = 4096 = 1000000000000
13bits = 8192 = 10000000000000
14bits = 16384 = 100000000000000
15bits = 32768 = 1e+15
16bits = 65536 = 1e+16
17bits = 131072 = 1e+17
18bits = 262144 = 1e+18
19bits = 524288 = 1e+19
20bits = 1048576 = 1e+20
21bits = 2097152 = 1e+21
22bits = 4194304 = 1e+22
23bits = 8388608 = 1e+23
24bits = 16777216 = 1e+24
25bits = 33554432 = 1e+25
26bits = 67108864 = 1e+26
27bits = 134217728 = 1e+27
28bits = 268435456 = 1e+28
29bits = 536870912 = 1e+29
30bits = 1073741824 = 1e+30
31bits = 2147483648 = 1e+31
32bits = 4294967296 = 1e+32
33bits = 8589934592 = 1e+33
34bits = 17179869184 = 1e+34
35bits = 34359738368 = 1e+35
36bits = 68719476736 = 1e+36
37bits = 137438953472 = 1e+37
38bits = 274877906944 = 1e+38
39bits = 549755813888 = 1e+39
40bits = 1099511627776 = 1e+40
41bits = 2199023255552 = 1e+41
42bits = 4398046511104 = 1e+42
43bits = 8796093022208 = 1e+43
44bits = 17592186044416 = 1e+44
45bits = 35184372088832 = 1e+45
46bits = 70368744177664 = 1e+46
47bits = 140737488355328 = 1e+47
48bits = 281474976710656 = 1e+48
49bits = 562949953421312 = 1e+49
50bits = 1.12589990684262e+15 = 1e+50
51bits = 2.25179981368525e+15 = 1e+51
52bits = 4.5035996273705e+15 = 1e+52
53bits = 9.00719925474099e+15 = 1e+53
54bits = 1.8014398509482e+16 = 1e+54
55bits = 3.6028797018964e+16 = 1e+55
56bits = 7.20575940379279e+16 = 1e+56
57bits = 1.44115188075856e+17 = 1e+57
58bits = 2.88230376151712e+17 = 1e+58
59bits = 5.76460752303424e+17 = 1e+59
60bits = 1.15292150460685e+18 = 1e+60
61bits = 2.30584300921369e+18 = 1e+61
62bits = 4.61168601842739e+18 = 1e+62
63bits = 9.22337203685478e+18 = 1e+63

No entiendo nada. ¿Alguien puede echar una mano con el tema y si puede ser, dar una solución a conseguir saltarse este límite? Muchas gracias Cristalab.

Por miglug

Claber

113 de clabLevel



Genero:Masculino  

chrome

 

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