Arredondar casas decimais para baixo

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

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

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?

‘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.

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?

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

RoundingMode.CEILING arredonda pra cima.

RoundingMode.FLOOR arredonda pra baixo.

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?

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.

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?

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;

esta dando erro:

Exception in thread “main” java.lang.NumberFormatException: For input string: “2,99”
at 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)

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!

1 curtida

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

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

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(",", ".")
    );
}