Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Java formatação de porcentagem usando BigDecimal

Preciso de ajuda. Eu quero imprimir 22.6%, mas só imprime 2.260%. Já usei o DecimalFormat ele imprime como quero, porém se eu mudar o valo para calcular 20% ele vai imprimir 0,2 ,ele não faz o calculo de porcentagem. Alguém pode me ajudar?

Locale localeBR = new Locale("pt","BR"); BigDecimal big = new BigDecimal("22.6").setScale(2, RoundingMode.HALF_EVEN); NumberFormat format = NumberFormat.getPercentInstance(localeBR); String por = format.format(big); System.out.println(por);

//Imprime 2.260%

4 respostas

Boa noite Carolina!

Esse resultado está sendo retornado porque a função getPercentualInstance considera 1 como 100%, logo, 22.6 resulta em 2.260%. Para que seja imprimido o resultado esperado, você deve dividir o valor da variável "big" por 100.

Também será necessário definir o máximo e o mínimo de casas decimais na instância do objeto "format" através dos métodos setMaximumFractionDigits e setMinimumFractionDigits.

Veja como ficará o código:

import java.text.NumberFormat;
import java.math.BigDecimal;
import java.util.Locale;
import java.math.*;

public class HelloWorld{

     public static void main(String []args){

        Locale localeBR = new Locale("pt","BR");

        BigDecimal big = new BigDecimal("22.60").setScale(2, RoundingMode.HALF_EVEN);

        BigDecimal divisor = new BigDecimal("100");

        NumberFormat format = NumberFormat.getPercentInstance(localeBR);

        format.setMaximumFractionDigits(2);
        format.setMinimumFractionDigits(2);

        String por = format.format(big.divide(divisor));

        System.out.println(por);

     }
}

Obrigada, Guilherme. Mas, a minha dúvida é a seguinte, se eu colocar BigDecimal big = new BigDecimal("0.6").setScale(2, RoundingMode.HALF_EVEN); ele irá imprimir 0,60%. Eu quero que ele faça a impressão nesse formato 6%.

solução!

Carolina,

Nesse caso, para código imprimir o valor 6% você precisa instanciar a variável big com o valor decimal que representa os 6%, que é o valor 0.06 (6%) e não o 0.6 (60%).

Como o número já está na representação decimal de 6% (0.06) não será necessário dividir a variável big por 100, conforme acontece na linha ( String por = format.format(big.divide(divisor)); )

Veja como ficará o código nesse cenário:

import java.text.NumberFormat;
import java.math.BigDecimal;
import java.util.Locale;
import java.math.*;

public class HelloWorld{

     public static void main(String []args){

        Locale localeBR = new Locale("pt","BR");

        BigDecimal big = new BigDecimal("0.06").setScale(2, RoundingMode.HALF_EVEN);

        NumberFormat format = NumberFormat.getPercentInstance(localeBR);

        format.setMaximumFractionDigits(2);
        format.setMinimumFractionDigits(2);

        String por = format.format(big);

        System.out.println(por); //imprimirá: 6,00%

     }
}

Obrigada, Guilherme me ajudou bastante .