Foro de elhacker.net

Programación => Java => Mensaje iniciado por: danielo- en 27 Marzo 2012, 15:47 pm



Título: Problema con la precisión del double
Publicado por: danielo- en 27 Marzo 2012, 15:47 pm
Haciendo una tarea para la creación de Redes Neuronales Artificiales, en donde necesito una gran precisión con los numeros, me tope con un problemita, que no busco como dar la explicación ni como resolver, la cuestión es simple:

Código
  1. double d1=0.5;
  2. double d2 = 0.4;
  3. System.out.println(d2-d1);
  4.  

en teoría el resultado debería dar = 0.1, pero el relsultado de esta operación en java es de: -0.09999999999999998 o.O ??? no lo entiendo, quiero pensar que tiene que ver con la precisión del valor double, pero pero... sigo sin entender U.U


Título: Re: Problema con la precisión del double
Publicado por: visualfree en 27 Marzo 2012, 19:26 pm
Aca te hice un ejemplo... lo que te falta es redondear y restar a la inversar ...

Código:
class Prueba{
        public static void main(String[] args)
        {
                double d1=0.5;
                double d2 = 0.4;

                double resta=(d1-d2);
                System.out.println(redondear(resta,2));

        }
        static double redondear( double numero, int decimales ) {
                return Math.round(numero*Math.pow(10,decimales))/Math.pow(10,decimales);
        }

}


Título: Re: Problema con la precisión del double
Publicado por: Pablo Videla en 27 Marzo 2012, 19:31 pm
Pero porque no da el resultado que debería dar y da ese numero inexacto? Esa es la pregunta y yo tambien quiero saber. No debería ser necesario redondearlo porque da un numero exacto. Sacalo con la calculadora XD


Título: Re: Problema con la precisión del double
Publicado por: fran800m en 27 Marzo 2012, 20:11 pm
Sería interesante una respuesta, porque a veces me ha pasado parecido con PHP y es frustrante, te ves impotente ante algo que carece por completo de sentido.


Título: Re: Problema con la precisión del double
Publicado por: danielo- en 27 Marzo 2012, 21:07 pm
Exacton, no entiendo porque sucede esto, y es algo tedioso, pero en fin, lo he resuelto de la siguiente manera:
Código
  1. public double redondea(double num){
  2.        BigDecimal res;
  3.        res = new BigDecimal(num).setScale(12, BigDecimal.ROUND_HALF_DOWN);
  4.        double resultado = res.doubleValue();
  5.        //System.out.println(resultado);
  6.        return resultado;
  7.    }
  8.  
  9.