Pq a conta esta errada?

Alguem sa me explicar pq o códogo:

[code]public class Simple1{
public static void main(String arg[]){
int a;
double b, c;

	a=3;
	b=5.2;
	c=a+b;
	
	System.out.println("-------");
	
	System.out.println("a= "+a);
	System.out.println("b= "+b);
	System.out.println("c= "+c);
	
	System.out.println("-------");
	
	System.out.println("c= "+c+" - "+b);
	c=c-b;
	System.out.println("c= "+c);
	
	System.out.println("-------");
	
	System.out.println("???????");
}

}[/code]

me da uma saida:

[code]
a=3;
b=5.2;
c=8.2

c= 8.2 - 5.2
c= 2.999999999999999

???[/code]

Tanto 8.2 quanto 5.2 não podem ser representados exatamente em binário. Então 8.2 é armazenado como um número que é 8.2 mais ou menos um erro muito pequeno, e 5.2 é armazenado como um número que é 5.2 mais ou menos um erro muito pequeno.
Casualmente, quando você subtraiu um número do outro, os erros não se cancelaram, e acabou dando esse número que não é exatamente 3 mas é quase 3, tanto é que se o Java imprimisse o número com menos casas ele iria mostrar arredondado para o valor esperado (3.0).