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.
<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.
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.
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.
<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.
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 !
Bueno y entonces porque no pasa con los otros números que también son decimales?
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.
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.
En javascript ni idea, en general los distintos streams tienen una opcion para formatear la salida...
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
Muy clara tu explicación para un recién iniciado.
:¬¬
joer macho xD yo no tengo mucha idea de javascript, pero si sabes medianamente programar, la funcion es autodescriptiva:
function roundNumber(num, dec) {
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
return result;
}
parte por parte (con amor)
function roundNumber(num, dec) {
}
funcion llamada roundNumber que acepta dos parametros, el numero a redondear y los decimales
var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
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!