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
armando-couto:
DecimalFormat
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.
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?
Jelson1
Fevereiro 24, 2020, 1:25pm
#10
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)
Jelson1
Fevereiro 24, 2020, 1:47pm
#12
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
Albertassi88:
String.formar
String.format(“R$ %.2f”, value);
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(",", ".")
);
}