Formatar Double sem perder a precisão  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

Oi pessoas.
Venho pedir a ajuda de vocês novamente.
Tenho uma variável double com o seguinte valor

0.9413161751385224


Quando uso o DecimalFormat para formatar ela para ficar com 2 casas depois da vírgula, o novo valor dela é

0.99


O que posso fazer para o valor dela ficar 0.94?

O código do método que formata está assim:


Fiz outras tentativas. Algumas arredondam corretamente e outras o resultado é gritante.

Essa string é 'parseada' com Double.parseDouble(s).

Abraço.

editad
á!
Imprimi dentro do método que formata. Os resultados saíram corretos:


0.441884562412021
0.44
0.9834094578521211
0.98
1.2823467534316422
1.28
4.01002319303043
4.01
-7.7508333333333335
-7.75


O parseDouble tem problemas quanto a isso?

Abraço.

This message was edited 1 time. Last update was at 10/04/2008 14:38:44


Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
diogosantana
Thread.start()

Membro desde: 03/04/2008 13:42:55
Mensagens: 25
Offline

Fiz o seguinte teste aqui baseado no seu código:

O resultado foi: 00.94

Talvez não esteja entendendo direito como o problema ocorre. Talvez você explique melhor, ou mostre o código onde você chama o método.
Uma possível motivo é a versão e fornecedor da VM que você está usando.
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

diogo,

As vezes ele retorna um resultado corre, como ocorreu e as vezes um resultado errado.

Por exemplo,


0.0247417852398292
formatadorAprimorado: 0.022
// O correto seria 0.024, entende?


Abraço.

Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
rbgalo
What is classpath?

Membro desde: 04/03/2008 19:08:21
Mensagens: 7
Offline

Use BigDecimal

tem um metodo para setar a escala .setScale(....);

diogosantana
Thread.start()

Membro desde: 03/04/2008 13:42:55
Mensagens: 25
Offline

Cara,

posta o código que você está usando para chamar. Passando esse último valor, aqui no meu exemplo saiu 0.025, que aliás é o resulado correto, ao invés de 0.024 como você falou, por causa do arredondamento.
Andre Brito
JWizard

Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline

diogosantana,

Consegui resolver.
No método formatador, como você pode ver, o parâmetro é ##.##, e como 0.024 são 3 casas, o correto é 0.025.
Aliás, lotei de casts pra double as divisões e agora está funcionando corretamente.

Dê uma olhada, se quiser.



Agora imprime os valores corretos.
E as divisões, estou fazendo uma de cada vez:



Acho que não dá diferença se fizer tudo na mesma linha, mas quando trata-se de double eu fico com um pé atrás. O cast ali é necessário?

Abraço.

Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change.
[WWW]
diogosantana
Thread.start()

Membro desde: 03/04/2008 13:42:55
Mensagens: 25
Offline

Acho que não. Se você escrever 40.0 o Java entende que é double.
Que bom que funcionou.

Abraço.
Reilander
JavaChild
[Avatar]

Membro desde: 27/01/2007 21:28:37
Mensagens: 142
Localização: Feira de Santana - BA
Offline

codigo para truncar um double:




codigo para arredondar um double:


"Por mais sujo que esteja o meu passado, meu futuro está intacto..."
[Email] [MSN]
AkimSalvador
Entusiasta Java

Membro desde: 25/03/2008 14:01:32
Mensagens: 15
Localização: Curitiba - PR
Offline

Não cheguei a testar seu código, inclusive estou com um problema parecido.

Mas se por acaso ainda não deu certo, tenta:
1)Mexer ali naquele "private" da sua classe, pode ser que tenha alguma variável de fora dela que você esteja precisando;
2)Confirmar se sua classe está "static" no caso de algum método exigir isso;
3)Fazer as contas separadas. Corrigi um erro grosseiro aqui fazendo um downcast de double pra int no lugar certo!

Se alguma dessas dicas ajudar, posso dar mais detalhes do que fiz aqui...
[Email] [WWW] [MSN]
sauron_fight
Debugger
[Avatar]

Membro desde: 07/11/2007 16:29:51
Mensagens: 56
Offline

Implementei um interface converter implementei os dois metados abaixo mais ainda assim
nao consigo ter o resultado esperado, quando escrevo os numeros 10,51 ele grava corretamente mais
se eu digitar 10,50 e gravado "10,5", como estou querendo fazer algums calculos monetatios daria erro

Agradeço a atenção!


public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor) throws ConverterException {
if(valor == null || valor.toString().trim().equals("")){
return 0.0d;

} else {
valor = valor.replaceAll(Pattern.quote("."), "");
valor = valor.replaceAll(Pattern.quote(","), ".");
Double a = Double.valueOf(valor);
return a;
}

}


public String getAsString(FacesContext arg0, UIComponent arg1, Object valor) throws ConverterException {

if(valor == null || valor.toString().trim().equals("")){
return "0,00";

} else {
DecimalFormat df = new DecimalFormat("###,##0.00");
df.setDecimalFormatSymbols( new DecimalFormatSymbols( new Locale( "PT", "BR" ) ) );
return df.format( valor );
}
}

This message was edited 1 time. Last update was at 06/11/2009 10:10:13

 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team