Conversão de Double para Float

Bom dia pessoal, sou novo aqui no GUJ e estou iniciando em Java, mas estou com a seguinte duvida… quando crio uma variável Double e insiro dentro dela um valor convertido em Float ele retorna um numero quebrado aproximado do que eu estipulei… alguem sabe porque?

abaixo o Código … para melhor explicar

public class Teste {
public static void main(String[] args) {

	double d;
	
	d = 125.32;
	System.out.println("valor de d = " + d);
	d = 125.32f;   /*  AQUI VEM A CONVERSÃO MAIS SAI UM NUMERO MUITO QUEBRADO, PQ?*/
	System.out.println("valor de d = " + d);



}

}

AQUI A SAIDA

Saída da impressão:

valor de d = 125.32
valor de d = 125.31999969482422

O porque disso é o seguinte.

O computador não trabalha bem com casas decimais. Como você sabe, os dados são representados internamente no formato binário.

O número 4, por exemplo, é representado pelo computador assim:
100 (onde 1x2^2 + 0x2^1 + 0x2^0 = 4)

Como é representado um número menor que zero? Cada casa após a vírgula representa os valores 1/2 (2^-1), 1/4 (2^-2), 1/8 (2^-3) e assim sucessivamente.

Então, os números 4,25 0,5 e 4,75 ficam assim em binário:
100,01 100,10 100,11

Que problema que você tem aí? O computador é muito pobre em representações de casas decimais. Tente representar 0,3.
Isso é 0,25 + 0,03125 + 0,009765635…

Para contornar o problema, o que se faz é o seguinte. Faz-se os cálculos com um número grande de casas decimais. E depois arredonda-se o resultado. Por isso diz que que contas em float e double são imprecisas. Os tipos primitivos estão sujeitos a precisão do processador. Alguns processadores chegam a 50 bits, o que já é suficiente para a maior parte das aplicações.

Entretanto, muitas vezes não é suficiente. O java fornece classes para que você manipule números de precisão arbitrária. Nesse caso, os calculos são feitos por software, e são muito mais lentos. Mas ainda sim, quebram um galhão.

Isso explica o porque da sua multiplicação ter retornado aquele 3 estranho lá no final do número.

BigDecimal não seria uma alternativa?

Legal agora entendi pq… hehee… vlw mesmo hein!!!

Valeu estava com esta mesma dúvida!!!