Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/12/2009, 09:36
Rubik
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 15 años, 1 mes
Puntos: 0
¿Mala precisión en Java? (con ejemplo)

Hola a todos, he creado un programa para hacer el redondeo de un número de tipo double. Curiosamente, en ocasiones aparecen ligeros fallos de precisión. Echad un vistazo:

Código Java:
Ver original
  1. public static double redondeo(double num, int decimales)
  2.   {
  3.     // Almacena el decimal siguiente a los decimales que queremos obtener
  4.     int ulti = (int)(num*Math.pow(10, decimales+1))%10;
  5.  
  6.     // Almacena el número truncado
  7.     num = (float)(int)(num*Math.pow(10, decimales))/Math.pow(10, decimales);
  8.  
  9.     // Le añade 0.1, 0.001, ... en función de los decimales pedidos
  10.     if(ulti>4)
  11.       num += Math.pow(10, -decimales);
  12.  
  13.     // Trunca de nuevo, parece que Java da ciertos fallos de precisión, y puede devolver algo como 3.1416000000000004 en lugar de 3.1416
  14.     num = (float)(int)(num*Math.pow(10, decimales))/Math.pow(10, decimales);
  15.  
  16.     return num;
  17.   }

Como veis, he tenido que añadir un truncamiento final para evitar cosas del tipo 3.1416000000000004. ¿A qué se debe esto? ¿Es culpa mía? ¿Es algo normal?

Gracias de antemano por vuestras respuestas.