Comparações entre Doubles

3 respostas Resolvido
Lucas_Gustavo

Olá Srs. :vulcan_salute:

Eu gostaria de um conselho, já li bastante consultas e a documentação do assunto.

Estou trabalhando com doubles, e chegou um momento me que preciso comparar esses valores. Sei que não são precisos, se lá na “quilhocentésima” casa um número for diferente do outro, la se vai pro espaço a minha comparação.
Já fiz a formatação para que esses valores fiquem com duas casas decimais e mesmo assim a comparação sempre cai em false.

Qual o conselho? converter para int eu deixaria as casas decimais e eu não queria isso, porque pode haver erro de digitação por parte do usuário!.. ou existe uma forma de comparação de Doubles? Sei lá, estabelecer uma tolerância de 2 casas decimais após o ponto talvez, há como fazer isso?

public void compararValor(){
                Double valorLiquido = Double.parseDouble(txtVlrLiquido.getText().trim().replaceAll(",", ""));//Aqui eu pego o valor Double digitado pelo usuário
                Double soma = 0.0;
                List<TabelaContaPagarCG> cg = tblContaGerencial.getItems();
                for (ModeloTabelaContaPagarCG tab : cg) {//Aqui eu pego a soma de valores de uma tabela
                        soma += tab.getValor();
                }

                if(valorLiquido > soma){
                     System.out.println("Valor digitado é maior que o valor da soma da tabela");
                }else if(valorLiquido < soma){
                     System.out.println("Valor digitado é menor que o valor da soma da tabela");
                }else{
                     System.out.println("Valor digitado é igual o valor da soma da tabela");
                }
        }

Agradeço desde já!

3 Respostas

Lucas_Camara

Só uma observação, esse replace não deveria ser assim:

txtVlrLiquido.getText().trim().replaceAll(",", ".") // com "." ponto ao invés de espaço em branco

?

Lucas_Gustavo

Olá Lucas… para o caso que estou usando não, como eu estou usando a formatação de moeda americana, o formato é assim! US 9,999.99… logo para que não dê um NumberFormatException no double, eu preciso apenas que saia a virgula! por isso o replace desta maneira. assim fica 9999.99

Lucas_Gustavo
Solucao aceita

Para quem tiver esse problema futuramente segue a forma que eu resolvi, informando um constante limite. Segue o código.

final double THRESHOLD = .01;
        double v1 = valorLiquido;
        double v2 = soma;

        if (Math.abs(v1 - v2) < THRESHOLD){
            System.out.println("v1 e v2 são iguais");
        }else{
            System.out.println("v1 e v2 não são iguais");
        }

Funcionou perfeitamente sem ter que converter pra qualquer outro tipo e considerou as duas casas após o ponto.

:vulcan_salute:

Criado 16 de dezembro de 2019
Ultima resposta 17 de dez. de 2019
Respostas 3
Participantes 2