Problema javascript una multiplicación me da un número periodico.

Iniciado por Aikanáro Anário, 16 Mayo 2011, 20:30 PM

0 Miembros y 1 Visitante están viendo este tema.

Aikanáro Anário

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 (javascript) [Seleccionar]

<script language ="javascript">
var edad;
edad = prompt ('Ingrese su edad:');
document.write ('Su edad en años es: ');
document.write (edad = edad*12);
document.write ('. Su edad en meses es: ');
document.write (edad = edad*4.30);
document.write ('. Su edad en semanas es: ');
document.write (edad = edad*7);
document.write ('. Su edad en días es: ');
document.write (edad = edad*24);
document.write ('. Su edad en horas: ');
document.write (edad = edad*60);
document.write ('. Su edad en minutos es: ');
document.write (edad = edad*60);
document.write ('. Su edad en segundos es: ');
document.write (edad);
</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.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pucheto

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.

Aikanáro Anário

#2
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 (javascript) [Seleccionar]
<script language ="javascript">
var edad;
edad = prompt ('Ingrese su edad:');
document.write ('Su edad en años es: ');
document.write (edad);
document.write ('. Su edad en meses es: ');
document.write (edad = edad*12);
document.write ('. Su edad en semanas es: ');
document.write (edad = edad*4.3);
document.write ('. Su edad en días es: ');
document.write (edad = edad*7);
document.write ('. Su edad en horas: ');
document.write (edad = edad*24);
document.write ('. Su edad en minutos es: ');
document.write (edad = edad*60);
document.write ('. Su edad en segundos es: ');
document.write (edad = edad*60);
</script>


Cita de: 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.

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.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pucheto

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 !

Aikanáro Anário

Bueno y entonces porque no pasa con los otros números que también son decimales?
Lo que faltaba en internet: http://binar10s.blogspot.com/

pucheto

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.

Aikanáro Anário

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.
Lo que faltaba en internet: http://binar10s.blogspot.com/

pucheto

En javascript ni idea, en general los distintos streams tienen una opcion para formatear la salida...

tragantras

Colaboraciones:
1 2

Aikanáro Anário

Lo que faltaba en internet: http://binar10s.blogspot.com/