Author Topic: float y double  (Read 8860 times)

clay

  • Jr. Member
  • **
  • Posts: 94
  • Karma: 0
    • View Profile
    • IFX
float y double
« on: Enero 06, 2008, 11:05:48 pm »
Hola:

Al parecer, la siguiente pregunta me la debería haber hecho cuando recien empecé a programar; pero bueno ya estoy aqui y recien me doy cuenta de esto.

Quisiera saber el porqué la salida que me bota las Sgtes. lineas de codigo:

for(float i=0f; i<1f; i+=0.1f)
   System.out.println( i );

Salida:

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001

Si el incremento es de 0.1, porque en la 8º iteracion me bota el 0.70000005 y no simplemente el 0.7.

Bueno ya se que double y float son tipos primitivos diferentes, pero me gustaria saber cual es la diferencia exactamente, porque si en lugar de float hubiera puesto double, lo que imprimiria serian otras cosas.

Me gustaria saber cual es la razon de esto ya que en mi programa tengo que hacer comparaciones de decimales y debido a esos incrementos nunca llega a detenerse en mi variable bandera.

Bueno gracias de antemano por la respuesta.

Saludos.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 4961
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: float y double
« Reply #1 on: Enero 07, 2008, 10:13:42 pm »
Hola:

En cualquier lenguaje de programación y no solo java, no se pueden representar todos los números con todos los decimales, ya que un float, por ejemplo, tiene 32 bits y con 32 bits no se pueden representar infinitos números con infinitos decimales. Por ello, al operar con decimales, es posible que aparezcan pequeños errores en los decimales más alejados. En tu caso, 0,7 es prácticamente igual a 0,70000005. Como te digo, este problema es general en todos los lenguajes de programación.

La solución suele ser "redondear" esos últimos decimales para ignorarlos. Por ejemplo, para comparar dos float NUNCA se debe usar el ==, sino algo como esto

if ( Math.abs(float1 - float2) < 1e-5)
...

es decir, ver si la diferencia en valor absoluto es menor que un número lo suficiententemente pequeño.

Con double tienes 64 bits, por lo que se pueden representar más valores y tendrás más precisión en los decimales, aunque seguirás teniendo el mismo problema. En vez de 0,70000005 igual te sale 0,7000000000000000000005, pero sigues con el mismo problema. La pega del double es que ocupa más memoria.

Se bueno.

rfilgueiras

  • Jr. Member
  • **
  • Posts: 78
  • Karma: 0
    • View Profile
    • Blog de programación
Re: float y double
« Reply #2 on: Enero 08, 2008, 08:09:13 am »
Si quieres operaciones más precisas con decimales utiliza la clase BigDecimal