Problemas com ponto flutuante e Random

4 respostas
S

[color=blue]Oi pessoal !!! Estou desenvolvendo uma classe em que preciso de um gerador de números float aleatório mas como eu não conseguia controlar o número de casas decimais depois da virgula, resolvi criar uma.

Tem alguma forma de fazer isso sem gambiarra ? Porque eu pesquisei e não encontrei… para ter controle do número de casas eu tive que gerar números inteiros e concatenar com uma string pra depois transformar em float. :roll:

O problema maior é que ele não ta gerando corretamente, pelo menos quando leio a variável float o número, algumas vezes, o numero de casas decimais esta maior do que eu determinei. Alguem tem ideia de qual pode ser o problema ?

Aqui estão o meu construtor e o método:

public Rands(int casasd, int varix)
	{
		ini = new Random();
		temp = new int[casasd];
		w = varix;
		concat = "0.";
		casasD = casasd;
		numero = 0;
	}

public float getRnd()
	{
		int rep = w;
		for(int x = 0; x < casasD; x++)
		{
			temp[x] = ini.nextInt(w);
			w = w - 1;
			concat = concat + String.valueOf(temp[x]);
		}
		w = rep;
		numero = Float.parseFloat(concat);
		
		return numero;
	}

Valeu pessoal !!!
Skyblue[/color]

4 Respostas

wcaquino

Olá skyblue,

Se vc utilizar a classe decimal format, vc vai poder controlar a quantidade de casas…

DecimalFormat decimalFormat = new DecimalFormat("0.0000");
System.out.println(decimalFormat.format(4.5));

Nesse código aí a saída é 4.5000… se o número tiver mais casas decimais ele vai arredondar :lol:

Flws

S

wcaquino:
Olá skyblue,

Se vc utilizar a classe decimal format, vc vai poder controlar a quantidade de casas…

DecimalFormat decimalFormat = new DecimalFormat("0.0000");
System.out.println(decimalFormat.format(4.5));

Nesse código aí a saída é 4.5000… se o número tiver mais casas decimais ele vai arredondar :lol:

Flws

[color=blue]Oi, o problema é que eu não preciso imprimir ou manipular strings, meu problema é pra manipular float mesmo. Eu tenho que somar e multiplicar floats, so queria saber se teria jeito sem ter que converter pra string e depois pra float novamente.

Valeu
Skyblue[/color]

David

Se você quiser que as casas decimais que estão sobrando sejam truncadas, e não arredondadas, você pode fazer algo assim:

  1. Multiplique por 10^(numero de casas decimais)
    2; Faça um cast para int.
  2. Faça um cast para double
  3. Divida por 10^(numero de casas decimais).

Exemplo: 4.78956 com três casas decimais.

  1. 4.78956 * 10^3 = 4789.56
  2. (int) 4789.56 = 4789
  3. (double) 4789 = 4789.0
  4. 4789.0 / 10^3 = 4.789

Com o DecimalFormat você iria obter 4.790, é só dar uma olhada no teste abaixo:

public static double truncar(double numero, int precisao) {
	int numInt = (int) (numero * Math.pow(10.0, precisao));
	return ((double) numInt) / Math.pow(10.0, precisao);
}
	
public static void main(String[] args) {
	double num = 4.78956;
	System.out.println(truncar(num, 3));
		
	DecimalFormat decimalFormat = new DecimalFormat("0.000");
	System.out.println(decimalFormat.format(num));		
}

Dependendo das suas necessidades você decide o que usar.

S

[color=blue]Oi pessoal !!! Pelo que estou vendo David, esta seria a forma mais facil mesmo, mais tarde vou tentar refatorar minha classe para usar isso.

Mais fica a crítica, eu achei muito chato isso ja não estar implementado na jdk… :frowning:

Valeu pessoal !!!
Skyblue[/color]

Criado 21 de abril de 2006
Ultima resposta 21 de abr. de 2006
Respostas 4
Participantes 3