Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Jorge lopez en 29 de Junio 2014, 21:01

Título: Ejercicio! entrega CU00644B error precision cálculos java números decimales
Publicado por: Jorge lopez en 29 de Junio 2014, 21:01
 Hola mi gente del foro!

Tengo la siguiente situación al ejecutar el método que he creado en esta clase según lo requerido por el ejercicio de esta entrega:

según el ejercicio si paso como valores de parámetros los valores (2.55,2) el método debería devolver 255 como resultado. pero mi método esta devolviendo 254.99999999999997 a pesar de que cuenta con una sintaxis que le indica multiplicar 2.55*100
Código: [Seleccionar]
base * resultado para obtener este resultado. mi pregunta es, porque no esta devolviendo 255 y en su lugar esta devolviendo  254.99999999999997.


Código: [Seleccionar]
public class multiplicadorDieces{
   
    public multiplicadorDieces(){
   
    }
    //metodo que devuelve el resultado de elevar 10 al valor de la variable exponente.
    public int diezElevadoAlValorDeExponente(int exponente){
        int resultado = 1;
        for(int i=1; i<=exponente; i++){resultado = resultado * 10;}
        return resultado;
    }
   
    //metodo que devuelve el resultado de multiplicar el valor de la variable base por el resultado de elevar 10 al valor de la variable exponente
    public double multiplicadorPorDieces(double base, int exponente){
        int resultado = 1;
        for(int i=1; i<=exponente; i++){resultado = resultado * 10;}
        return base * resultado ;
    }
}

Salu2!
Título: Re:Ejercicio! entrega CU00644B
Publicado por: César Krall en 30 de Junio 2014, 20:07
Tienes razón  :o La respuesta a por qué no está devolviendo el resultado correcto está relacionado con la forma de representar los valores numéricos decimales que tienen los computadores. Nosotros pensamos que usan números como nosotros pero internamente no es así.

En este caso te has encontrado con un problema que se presenta con cierta frecuencia: la precisión cuando se trabaja con decimales.

Es algo que llevaría tiempo conocer en profundidad, por ello lo que te recomiendo es que apliques una solución conocida, como usar:

return Math.round(base * resultado * 100000) / 100000;

De este modo obtienes el resultado correcto, al menos en las pruebas que he podido hacer sí me lo devuelve correctamente.

Saludos!
Título: Re:Ejercicio! entrega CU00644B
Publicado por: Jorge lopez en 30 de Junio 2014, 22:25
 Excelente! Creo que estoy comenzando a amar las api  ;D

Gracias César. Salu2!