Arredondar casas decimais para baixo

14 respostas Resolvido
java
A

Estou com uma duvida no código abaixo:

Eu entro com um número qualquer para o ‘valordecompra’ e o resultado dessa operação exemplo seja 1.398576. Eu preciso que o resultado dessa operação seja 1,39, o restante dos números pode ser desconsiderado.

Como posso fazer com que o resultado seja 1,39?

public Double txLiquidacao2(Double valorCompra, Double valorVenda) {

double convtxliquidacao = txliquidacao / 100;

double totalliquidacao = convtxliquidacao * valorCompra;

return totalliquidacao;

}

14 Respostas

A

Exemplo:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

Qualquer dúvida, olha aqui: https://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java

A

Eu li que usando o BigDecimal, seria uma forma mais correta para o que preciso, qual a diferença do BigDecimal para o DecimalFormat?

E no meu código como ficaria usando o BigDecimal?

S

‘BigDecimal’ é uma classe que representa um número decimal com precisão virtualmente infinita (o limite é a memória da JVM).

‘DecimalFormat’ é uma classe utilizada para formatar valores decimais, os valores formatados são representados na forma de 'String’s.

A

Tentei com o DecimalFormat e não é o que preciso.

exemplo no código abaixo usando o DecimalFormat o resultado esta sendo 12,46 pois ele esta arredondando as casas decimais para cima, nesse exemplo preciso que o resultado seja 12,45 ou seja que ele arredonde o resultado para baixo.:

DecimalFormat df = new DecimalFormat("#.##");

df.setRoundingMode(RoundingMode.CEILING);

double numero = 12.4599;

System.out.println(df.format(numero));

mais alguém que pode me ajudar?

S

Seria interessante ler a documentação das classes que você usa. :wink:

RoundingMode.CEILING arredonda pra cima.

RoundingMode.FLOOR arredonda pra baixo.

A

Fiz o testes aqui com o RoundingMode.FLOOR e ainda não é o que preciso,

o RoundingMode.FLOOR arredonda para baixo sim mais ‘‘visualmente’’ igual o String.formar("%.2f" , x);

Eu preciso que ele arredonde para baixo e o restante das casas decimais sejam apagadas para quando eu for somar algo. olha o exemplo abaixo:

exemplo1

double numero1 = 2.99;

double numero2 = 2.99;

double soma = numero1 + numero2;

System.out.println(soma);

Resultado: 5.98
exemplo 2	

double numero3 = 2.999;

double numero4 = 2.999;

DecimalFormat df = new DecimalFormat("#.##");

df.setRoundingMode(RoundingMode.FLOOR);

double soma2 = numero3 + numero4;

System.out.println(df.format(soma2));

Resultado: 5,99

Viu que o resultado usando o DecimalFormat foi alterado, ao invés do resultado ser 5.98 igual no exemplo 1, no exemplo 2 ele esta aumentado 1 centavo para 5,99 por causa das casas decimais, ele tira a casa decimal visualmente apenas, mais mantém ela na memória, eu preciso que essa casa decimal não fique na memória.

Alguém pode me ajudar?

S

Então tu não podes usar double, Double, float nem Float.

Vais ter que trabalhar somente com BigDecimal e usar o método setScale pra fixar em duas casas decimais.

A

Fiz dessa forma e ele continua somando a casa decimal:

double numero3 = 2.999;
	double numero4 = 2.999;
	BigDecimal b1 = new BigDecimal(numero3);
	BigDecimal b2 = new BigDecimal(numero4);
	BigDecimal b3 = b1.add(b2);

    System.out.println(b3.setScale(2, BigDecimal.ROUND_FLOOR));

onde esta o erro?

J

Antes de realizar a soma, os dois valores devem estar com duas casas decimais;
Tente assim:

numero3 = Double.parseDouble(df.format(numero3));
numero4 = Double.parseDouble(df.format(numero4)); 
double soma = numero3 +numero4;
A

esta dando erro:

Exception in thread main java.lang.NumberFormatException: For input string: 2,99at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)

at sun.misc.FloatingDecimal.parseDouble(Unknown Source)

at java.lang.Double.parseDouble(Unknown Source)

at program.Programa.main(Programa.java:29)
J
Solucao aceita

Desculpe! Isso acontecendo devido o df.format() está retornando 2,99( não é um número válido para conversão) em vez de 2.99.

Você pode tentar usar o BigDecimal:

BigDecimal b1 = new BigDecimal(numero3);
BigDecimal b2 = new BigDecimal(numero4);
b1=b1.setScale(2, BigDecimal.ROUND_FLOOR);
b2=b2.setScale(2, BigDecimal.ROUND_FLOOR);
BigDecimal b3 = b1.add(b2);

A ideia é a mesma você tem que converter para duas casas decimais antes de realizar a soma!

O df.format() tem uma propriedade que define o separador decimal . ou , poderia ser uma alternativa também!

A

Deu certo dessa forma convertendo para duas casas decimais antes de realizar a soma, muito obrigado mesmo mano, Deus te abençoe…

S

Você não fez o setScale no b1 nem no b2 antes de somá-los

P

String.format(“R$ %.2f”, value);

image

Não atende o critério acima, mas nada que não possa ser contornado, do ponto de vista simbólico, com a manipulação de dados.

public void limiteDecimal() {
    System.out.println(limiteDecimal(5.6789, 2));
}

static double limiteDecimal(double value, int casasDecimais) {
    return Double.parseDouble(
            String.format("%." + casasDecimais + "f", value)
                  .replace(",", ".")
    );
}
Criado 23 de fevereiro de 2020
Ultima resposta 25 de fev. de 2020
Respostas 14
Participantes 5