DecimalFormat - Problemas

8 respostas
R

Pessoal, não estou conseguindo formatar o valor o valor de hAl do método calculaPh(). Quando formato essa valor a String esta recebendo “0.0000” da mesma forma que foi declarada no DecimalFormat mas o hAl esta recebendo o valor correto. Alguém sabe o que pode estar ocorrendo?

public void calculaPh() {

		DecimalFormat f = new DecimalFormat("0.0000");

		mediaPh = ph + 0.1;
		solDeterminacaoSelecionada.setpH(mediaPh);

		if (solDeterminacaoSelecionada.getpH() != null) {

			int v1Padrao = 23504;
			double v2Padrao = -1.0537 * ph;
			double hAl = Math.pow(v1Padrao, v2Padrao);
                        String exibirHal = f.format(hAl)

			solDeterminacaoSelecionada.sethAL(exibirHal);
                        
		
		}
	}

Desde já agradeço.

Abraços.

Renan.

8 Respostas

Rodrigo_Sasaki

Que? Não consegui entender o que você quis dizer, cara.

Tente elaborar mais, fale o valor que você está enviando, o valor que é retornado, e o valor que você queria que fosse retornado.

R

Rodrigo, meu problema esta aqui.

double hAl = Math.pow(v1Padrao, v2Padrao);  
  String exibirHal = f.format(hAl)  
  
            solDeterminacaoSelecionada.sethAL(exibirHal);

A variavel hAl esta recebendo por exemplo o valor 4.52682525525625444. Estou utilizando DecimalFormat para formatar o valor com 4 casas decimais, portanto, deveria retornar o valor 4.5268. O que esta acontecendo é que a String que recebe o numero formatado esta recebendo “0.0000” e não consigo achar o motivo.

Deu para entender?

Abraços.

Renan.

sarkozy

use este metodo para formatas numerro de casas decimais:

public static Double decimalFormat(double number, int decimalLength)
    {
	if (decimalLength > 0)
	{
	    decimalLength = decimalLength + 1;
	    String strNumber = new Double(number).toString();
	    int dotIndex = strNumber.indexOf(".");
	    strNumber = strNumber.substring(0, dotIndex + decimalLength);
	    number = Double.parseDouble(strNumber);
	    return number;

	}
	return null;
    }

number = numero que vc quer formatar.
decimalLength = numero de casas decimais que vc quer. No seu caso acho que sao 4.

Rodrigo_Sasaki
sarkozy:
use este metodo para formatas numerro de casas decimais:
public static Double decimalFormat(double number, int decimalLength)
    {
	if (decimalLength > 0)
	{
	    decimalLength = decimalLength + 1;
	    String strNumber = new Double(number).toString();
	    int dotIndex = strNumber.indexOf(".");
	    strNumber = strNumber.substring(0, dotIndex + decimalLength);
	    number = Double.parseDouble(strNumber);
	    return number;

	}
	return null;
    }

number = numero que vc quer formatar.
decimalLength = numero de casas decimais que vc quer. No seu caso acho que sao 4.


Se você retornar um double, não vai ter adiantado nada toda essa formatação. Porque ele será simplesmente um número

sarkozy

Esse codigo retorna um numero com a quantidade de casas decimais desejadas. É pra retornar um numero mesmo. Deveria retornar o q?

Rodrigo_Sasaki

Opa, deixa pra lá… vi seu código e pensei que ele iria ser executado de maneira diferente. Minha culpa :slight_smile:

De qualquer forma, segue uma variação do método: public static Double decimalFormat(double number, int decimalLength){ NumberFormat nf = DecimalFormat.getInstance(Locale.US); nf.setMaximumFractionDigits(decimalLength); return Double.parseDouble(nf.format(number)); }

E

Uma forma mais eficiente de arredondar um número double para N casas depois da vírgula segue abaixo.

Note que há o seguinte problema, que é inevitável devido ao funcionamento do ponto flutuante no computador (e não importa o que você faça, é possível provar matematicamente que isso vai acontecer): volta e meia, o arredondamento para um double irá retornar um número que, impresso pelo Java, não terá o número desejado de casas decimais depois da vírgula. Outra coisa que você deve lembrar é que um double não guarda dentro de si a informação de quantas casas devem ser impressas dentro da vírgula. Você vai perceber isso quando olhar os casos “8” e “9” do programa abaixo.

public class TesteArredondamento {
    private static double potencias10[] = {
		1, 
		1E+1, 1E+2, 1E+3, 1E+4, 1E+5, 1E+6, 1E+7, 1E+8, 1E+9, 1E+10, 1E+11, 1E+12, 1E+13, 1E+14, 1E+15
	};
    public static double arredondar (double valor, int ncasas) {
		if (ncasas > 15)
			return valor;
		else if (ncasas < 0)
			ncasas = 0;
		return Math.round (valor * potencias10[ncasas]) / potencias10[ncasas];
	}
	public static void main (String[] args) {
		double d = 1.2345678901234567890;
		System.out.println ("d = " + d);
		for (int n = 0; n < 15; n++) {
			System.out.println ("d com " + n + " casas = " + arredondar (d, n));
		}
	}
}

A saída dele é:

d = 1.2345678901234567
d com 0 casas = 1.0
d com 1 casas = 1.2
d com 2 casas = 1.23
d com 3 casas = 1.235
d com 4 casas = 1.2346
d com 5 casas = 1.23457
d com 6 casas = 1.234568
d com 7 casas = 1.2345679
d com 8 casas = 1.23456789
d com 9 casas = 1.23456789
d com 10 casas = 1.[telefone removido]
d com 11 casas = 1.[telefone removido]
d com 12 casas = 1.234567890123
d com 13 casas = 1.2345678901235
d com 14 casas = 1.23456789012346
Rodrigo_Sasaki

Excelente exemplo, entanglement.

Eu suspeitava que algo assim poderia acontecer, mas não sabia como provar.

Por isso que quando vou formatar algo eu sempre prefiro deixar como String mesmo.

Criado 19 de outubro de 2012
Ultima resposta 20 de out. de 2012
Respostas 8
Participantes 4