Foros del Web » Programación para mayores de 30 ;) » Java »

¿Mala precisión en Java? (con ejemplo)

Estas en el tema de ¿Mala precisión en Java? (con ejemplo) en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 18/12/2009, 09:36
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 4 meses
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.
  #2 (permalink)  
Antiguo 18/12/2009, 09:46
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: ¿Mala precisión en Java? (con ejemplo)

Es algo normal, casi todos los lenguajes de programación requieren un tratamiento especial para no perder precision con los numeros con coma flotante debido a que ese tratamiento es muy costoso, asi que por defecto no se usa.

En el caso de Java, hay que recurrir a la clase java.math.BigDecimal.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 18/12/2009, 11:47
 
Fecha de Ingreso: diciembre-2009
Mensajes: 2
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: ¿Mala precisión en Java? (con ejemplo)

Gracias por tu respuesta, me has sacado de dudas, un saludo.
  #4 (permalink)  
Antiguo 18/12/2009, 12:14
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: ¿Mala precisión en Java? (con ejemplo)

De nada , y por cierto se me ha olvidado comentar que si quieres redondear double, tambien puedes hacerlo con la clase BigDecimal a través del método round, pasandole la precisión y el tipo de redondeo con la clase MathContext.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:49.