Como imprimir um flutuador com 2 casas decimais em Java?


Respostas:


250

Você pode usar o printfmétodo, assim:

System.out.printf("%.2f", val);

Em resumo, a %.2fsintaxe diz ao Java para retornar sua variável ( val) com 2 casas decimais ( .2) na representação decimal de um número de ponto flutuante ( f) desde o início do especificador de formato ( %).

Existem outros caracteres de conversão que você pode usar além de f:

  • d: inteiro decimal
  • o: inteiro octal
  • e: ponto flutuante na notação científica

13
Tenha cuidado, pois String.format depende da sua configuração local atual; talvez você não consiga um ponto como separador. Prefiro usarString.format(java.util.Locale.US,"%.2f", val);
Gomino 02/02

1
@gomino Por que não Locale.FRANCE?
Erickson 27/05

3
@gomino Exatamente. Então, por que você colocaria pontos em números para usuários franceses?
Erickson 27/05

1
Adicionei esse comentário como um lembrete para avisar as pessoas que esperam ter sempre um ponto como separador.
Gomino 27/05

6
@ gomino Isso faz sentido, mas acho que "preferir" a codificação embutida Locale.USvai longe demais. Se você precisar codificar um código de idioma "neutro" para dobrar maiúsculas e minúsculas, renderização de números etc., especifique Locale.ROOT. Isso seria apropriado para o texto que será consumido por outro programa, em vez de renderizado para usuários humanos. Para o texto apresentado a um usuário, respeite seu código de idioma, se ele foi especificado explicitamente ou se é o padrão.
Erickson 27/05

179

Você pode usar DecimalFormat. Uma maneira de usá-lo:

DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
System.out.println(df.format(decimalNumber));

Outro é construí-lo usando o #.##formato.

Acho todas as opções de formatação menos legíveis do que chamar os métodos de formatação, mas isso é uma questão de preferência.


11
O que aconteceu com a System.out.printf("%.2f", value)sintaxe? Ainda está por aí?
Anthony Forloney

6
isto é. ainda é uma opção - você pode recuperar a sua resposta;)
Bozho

Parece que é minha opção, pois ainda não sei usar o DecimalFormat :) Obrigado!
via_point

Não faço muito trabalho em Java há algum tempo e, quando continuava vendo DecimalFormatrespostas, imediatamente pensei que estava errado, mas obrigado por esclarecer isso.
Anthony Forloney

9
adicione df.setMinimumFractionDigits(2);para forçar dois dígitos
Terel 19/03/14

88

Eu sugeriria o uso de String.format () se você precisar do valor como Stringno seu código.

Por exemplo, você pode usar String.format()da seguinte maneira:

float myFloat = 2.001f;

String formattedString = String.format("%.02f", myFloat);

14
"% .02f" e "% .2f" é a mesma coisa
Borzh

40
double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

5
Oi Kevin, se digitar 10.0000, estou recebendo apenas 10. Se eu quiser exibir 10.00, como posso fazer?
precisa saber é o seguinte

2
@ Mdhar9e useDecimalFormat df = new DecimalFormat("0.00");
K.Sopheak

16
float f = 102.236569f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsF = Float.valueOf(decimalFormat.format(f)); // output is 102.24

4
Dependendo da localidade, você pode obter uma vírgula. Se você deseja um separador de pontos, use o seguinte: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM

10
float floatValue=22.34555f;
System.out.print(String.format("%.2f", floatValue));

A saída é 22,35. Se você precisar de 3 casas decimais, mude para "% .3f".



9

Um truque simples é gerar uma versão mais curta da sua variável, multiplicando-a por exemplo 100, arredondando-a e dividindo-a 100.0novamente. Dessa forma, você gera uma variável com 2 casas decimais :

double new_variable = Math.round(old_variable*100) / 100.0;

Esse "truque barato" sempre foi bom o suficiente para mim e funciona em qualquer idioma (eu não sou uma pessoa Java, apenas aprendendo).


1
Isso está errado, muitos números repetirão números na representação flutuante depois que você dividir por 100. Portanto, não duas casas decimais.
Matt

8

Você pode usar esses códigos rápidos abaixo que se alteraram no final. Adicione quantos zeros se refere após o ponto

float y1 = 0.123456789;
DecimalFormat df = new DecimalFormat("#.00");  
y1 = Float.valueOf(df.format(y1));

A variável y1 era igual a 0,123456789 antes. Após o código, ele se transforma apenas em 0,12 .


2
Não exibe 0 antes do ponto. Deve ser DecimalFormat df = new DecimalFormat ("0.00");
Ridhuvarshan 20/02

Com certeza! DecimalFormat ("0.00") também funcionará! Ótimo local.
Bay

6

Veja DecimalFormat

Aqui está um exemplo do tutorial:

  DecimalFormat myFormatter = new DecimalFormat(pattern);
  String output = myFormatter.format(value);
  System.out.println(value + "  " + pattern + "  " + output);

Se você escolher um padrão como "###. ##", receberá duas casas decimais e acho que os valores são arredondados. Você vai querer olhar para o link para obter o formato exato que deseja (por exemplo, se deseja zeros à direita)


5

Abaixo está o código de como você pode exibir uma saída de dados flutuantes com 2 casas decimais em Java:

float ratingValue = 52.98929821f; 
DecimalFormat decimalFormat = new DecimalFormat("#.##");
float twoDigitsFR = Float.valueOf(decimalFormat.format(ratingValue)); // output is 52.98

3

OK - str para flutuar.

package test;

import java.text.DecimalFormat;

public class TestPtz {
  public static void main(String[] args) {
    String preset0 = "0.09,0.20,0.09,0.07";
    String[] thisto = preset0.split(",");    
    float a = (Float.valueOf(thisto[0])).floatValue();
    System.out.println("[Original]: " + a);   
    a = (float) (a + 0.01);

    // Part 1 - for display / debug
    System.out.printf("[Local]: %.2f \n", a);
    // Part 2 - when value requires to be send as it is
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(2);
    df.setMaximumFractionDigits(2);
    System.out.println("[Remote]: " + df.format(a));

  }
}

Resultado:

run:
[Original]: 0.09
[Local]: 0.10 
[Remote]: 0.10
BUILD SUCCESSFUL (total time: 0 seconds)

1

pequeno programa simples para demonstração:

import java.io.*;
import java.util.Scanner;

public class twovalues {

    public static void main(String args[]) {

        float a,b;
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter Values For Calculation");

        a=sc.nextFloat();
        b=sc.nextFloat();

        float c=a/b;
        System.out.printf("%.2f",c);
    }
}

1

Faça isso apenas String str = System.out.printf("%.2f", val).replace(",", ".");se quiser garantir que, independentemente da localidade do usuário, você sempre obtenha / exiba um "." como separador decimal. Isso é obrigatório se você não quiser interromper o programa se, posteriormente, fizer algum tipo de conversão comofloat f = Float.parseFloat(str);


1

Um problema que me levou por uma hora ou mais, em DecimalFormat- Ele lida com entradas duplas e flutuantes de maneira diferente. Mesmo a mudança de RoundingMode não ajudou. Não sou especialista, mas achei que poderia ajudar alguém como eu. Acabou usando Math.round. Ver abaixo:

    DecimalFormat df = new DecimalFormat("#.##");
    double d = 0.7750;
    System.out.println(" Double 0.7750 -> " +Double.valueOf(df.format(d)));
    float f = 0.7750f;
    System.out.println(" Float 0.7750f -> "+Float.valueOf(df.format(f)));
    // change the RoundingMode
    df.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(" Rounding Up Double 0.7750 -> " +Double.valueOf(df.format(d)));
    System.out.println(" Rounding Up Float 0.7750f -> " +Float.valueOf(df.format(f)));

Resultado:

Double 0.7750 -> 0.78
Float 0.7750f -> 0.77

Rounding Up Double 0.7750 -> 0.78
Rounding Up Float 0.7750f -> 0.77

0

Experimente o seguinte: -

private static String getDecimalFormat(double value) {

    String getValue = String.valueOf(value).split("[.]")[1];

      if (getValue.length() == 1) {
          return String.valueOf(value).split("[.]")[0] +
                "."+ getValue.substring(0, 1) + 
                String.format("%0"+1+"d", 0);
       } else {
          return String.valueOf(value).split("[.]")[0]
            +"." + getValue.substring(0, 2);
      }


 }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.