Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: Aikanáro Anário en 16 Mayo 2011, 20:30 pm



Título: Problema javascript una multiplicación me da un número periodico.
Publicado por: Aikanáro Anário en 16 Mayo 2011, 20:30 pm
Este es mi primer programa con javascript. Que calculo a partir de los años. El tiempo que has vivido en meses, semanas, días, segundos y minutos aproximadamente, claro.

Código
  1. <script language ="javascript">
  2. var edad;
  3. edad = prompt ('Ingrese su edad:');
  4. document.write ('Su edad en años es: ');
  5. document.write (edad = edad*12);
  6. document.write ('. Su edad en meses es: ');
  7. document.write (edad = edad*4.30);
  8. document.write ('. Su edad en semanas es: ');
  9. document.write (edad = edad*7);
  10. document.write ('. Su edad en días es: ');
  11. document.write (edad = edad*24);
  12. document.write ('. Su edad en horas: ');
  13. document.write (edad = edad*60);
  14. document.write ('. Su edad en minutos es: ');
  15. document.write (edad = edad*60);
  16. document.write ('. Su edad en segundos es: ');
  17. document.write (edad);
  18. </script>

El problema es que me dan números decimales periodicos. Por ejemplo, si mi edad es 18, el número de semanas que me da es 6501.599999999999 y no sé de donde salen todos esos nueves.

Si pongo 14 por edad, el número de días, horas, minutos y segundos, me dan periódicos.

Pero si por ejemplo pongo 20, todo me da bien.

Una multiplicación de números decimales no periodicos no puede dar un periodico.

Nota: este código tiene un error de lógica, ver el código de más abajo, que está corregido.


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: pucheto en 16 Mayo 2011, 20:47 pm
edad = 18 * 12  --> ( 216 )
edad = (216) *4.30 --> (928.8)
edad = (928.8) * 7 --> (6501.6)

A vos te da con decimales periodicos pq hay q acordarse q la representacion de punto flotante de las pcs es finita, y pq se puede usar por redondeo o por truncamiento.


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: Aikanáro Anário en 16 Mayo 2011, 21:04 pm
En el algoritmo anterior había un pequeño error de cálculo. Ahora está corregido. El error no tiene nada que ver con lo que pregunto, era que la edad en años estaba mal y como todo se deriva de los años, todo estaba mal.

Código
  1. <script language ="javascript">
  2. var edad;
  3. edad = prompt ('Ingrese su edad:');
  4. document.write ('Su edad en años es: ');
  5. document.write (edad);
  6. document.write ('. Su edad en meses es: ');
  7. document.write (edad = edad*12);
  8. document.write ('. Su edad en semanas es: ');
  9. document.write (edad = edad*4.3);
  10. document.write ('. Su edad en días es: ');
  11. document.write (edad = edad*7);
  12. document.write ('. Su edad en horas: ');
  13. document.write (edad = edad*24);
  14. document.write ('. Su edad en minutos es: ');
  15. document.write (edad = edad*60);
  16. document.write ('. Su edad en segundos es: ');
  17. document.write (edad = edad*60);
  18. </script>

edad = 18 * 12  --> ( 216 )
edad = (216) *4.30 --> (928.8)
edad = (928.8) * 7 --> (6501.6)

A vos te da con decimales periodicos pq hay q acordarse q la representacion de punto flotante de las pcs es finita, y pq se puede usar por redondeo o por truncamiento.

Mmm, no me convence tu respuesta, porque al multiplicar la edad en meses (216) por la edad el número de semanas que tiene un mes (4.3) para que nos de el número de semanas, da como resultado un decimal también (928.8) y ese decimal, obviamente no es periódico, ni con la calculadora, ni con el programa. Pero cuando se multiplica ese resultado por 7 para el número de días, ahí es cuando da el decimal periódico en el programa.

O sea, si fuera como tu dices tanto el 928.8 (de las semanas) como el 156038.4 (de las horas vividas) fueran periódicos en el programa.


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: pucheto en 17 Mayo 2011, 04:17 am
http://babbage.cs.qc.edu/IEEE-754/Decimal.html por ahi con esto vas a ver bien lo q digo.... La representacion en punto flotante no es exacta !


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: Aikanáro Anário en 17 Mayo 2011, 05:27 am
Bueno y entonces porque no pasa con los otros números que también son decimales?


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: pucheto en 17 Mayo 2011, 13:56 pm
Pq para algunos numeros justo cae en un lugar donde float tiene representacion decimal exacta.... cuando se trabaja en punto flotante hay un monton de tipos de errores, errores cuando sumas, cuando restas, errores de division y multiplicacion... error con cualquier operacion q hagas... error de guardar en memoria! ( se trabaja en punto flotante de 80bits en la fpu ). Los numeros de punto flotante no se manejan nunca de forma exacta, se manejan siempre por tolerancias y errores.


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: Aikanáro Anário en 17 Mayo 2011, 19:31 pm
Ok, ya entendí. Gracias  ;D

¿Cómo se controla eso en javascript? para que el resultado solo se muestre con x numeros de precisión.


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: pucheto en 18 Mayo 2011, 03:23 am
En javascript ni idea, en general los distintos streams tienen una opcion para formatear la salida...


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: tragantras en 18 Mayo 2011, 09:18 am
function roundNumber(num, dec) {
   var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
   return result;
}

@http://forums.devarticles.com/javascript-development-22/javascript-to-round-to-2-decimal-places-36190.html


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: Aikanáro Anário en 18 Mayo 2011, 23:26 pm
Muy clara tu explicación para un recién iniciado.
 :¬¬


Título: Re: Problema javascript una multiplicación me da un número periodico.
Publicado por: tragantras en 19 Mayo 2011, 00:13 am
joer macho xD yo no tengo mucha idea de javascript, pero si sabes medianamente programar, la funcion es autodescriptiva:

Código
  1. function roundNumber(num, dec) {
  2.   var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
  3.   return result;
  4. }


parte por parte (con amor)

Código
  1. function roundNumber(num, dec) {
  2. }

funcion llamada roundNumber que acepta dos parametros, el numero a redondear y los decimales

Código
  1.   var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
  2. }

crea una variable llamada result. Se ve que en javascript nativamente solo está la funcion Math.round que te redondea a Integer.
Math.pow(base, i), hace la potencia i-ésima del número "base" ( = base^i )

piensa un poco dude!