Formatar Double sem perder a precisão

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

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

O que posso fazer para o valor dela ficar 0.94?

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

private String formatador(double valor)
{
    DecimalFormat formatador = new DecimalFormat("##,##00.00");
    String s = formatador.format(valor);
    s = s.replace(',', '.');
        
    return s;
}

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:

O parseDouble tem problemas quanto a isso?

Abraço.

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

public static void main(String[] args) { System.out.println(formatador( 0.9413161751385224)); } private static String formatador(double valor) { DecimalFormat formatador = new DecimalFormat("##,##00.00"); String s = formatador.format(valor); s = s.replace(',', '.'); return s; }
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.

diogo,

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

Por exemplo,

Abraço.

Use BigDecimal

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

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.

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.

        precoVendaQueijo = Double.parseDouble(formatadorAprimorado(randomizaValores(PRECO_MIN_GRAMA_QUEIJO, PRECO_MAX_GRAMA_QUEIJO)));
        precoVendaQueijo = precoVendaQueijo * LITRO_EQUIVALE_GRAMA_QUEIJO;
        precoVendaQueijo = Double.parseDouble(formatador(precoVendaQueijo));

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

resultado = (quantidadeLitrosLeitePuro * precoVendaLeitePuro)/(double)20;
resultado = resultado + (quantidadeLitrosLeitePasteurizado * precoVendaLeitePasteurizado)/(double)40;
resultado = resultado + (quantidadeLitrosLeiteIogurte * precoVendaLeiteIogurte)/(double)100;
resultado = resultado + (quantidadeLitrosLeiteQueijo * precoVendaQueijo)/(double)200;

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.

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

Abraço.

codigo para truncar um double:

public static double trunc(double valor, int casas) { double p = Math.pow(10, casas); return Math.floor(((valor+0.00000001) * p)) / p; }

codigo para arredondar um double:

public static double round(double valor, int casas) { double p = Math.pow(10, casas); return Math.round(valor * p) / p; }

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…

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 );
    }
}