¿Cómo imprimir un flotante con 2 decimales en Java?


Respuestas:


250

Puede usar el printfmétodo, así:

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

En resumen, la %.2fsintaxis le dice a Java que devuelva su variable ( val) con 2 decimales ( .2) en representación decimal de un número de coma flotante ( f) desde el inicio del especificador de formato ( %).

Hay otros caracteres de conversión que puede usar además f:

  • d: entero decimal
  • o: entero octal
  • e: coma flotante en notación científica

13
Tenga cuidado ya que String.format depende de su configuración local actual, es posible que no obtenga un punto como separador. Prefiero usarString.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino ¿Por qué no Locale.FRANCE?
erickson

3
@gomino Exactamente. Entonces, ¿por qué pondrías puntos en los números para los usuarios franceses?
erickson

1
Agregué este comentario como un recordatorio para advertir a las personas que esperan tener siempre un punto como separador.
Gomino

66
@gomino Eso tiene sentido, pero creo que "preferir" la codificación dura Locale.USva demasiado lejos. Si necesita codificar una configuración regional "neutral" para el plegado de mayúsculas, la representación de números, etc., especifique Locale.ROOT. Esto sería apropiado para el texto que será consumido por otro programa, en lugar de ser presentado para usuarios humanos. Para el texto presentado a un usuario, respete su configuración regional, ya sea que la haya especificado explícitamente o sea la predeterminada.
erickson

179

Puedes usar DecimalFormat. Una forma de usarlo:

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

Otro es construirlo usando el #.##formato.

Encuentro que todas las opciones de formato son menos legibles que llamar a los métodos de formato, pero eso es una cuestión de preferencia.


11
¿Qué pasó con la System.out.printf("%.2f", value)sintaxis? ¿Todavía está por aquí?
Anthony Forloney

66
es. sigue siendo una opción: puede recuperar su respuesta;)
Bozho

Parece que es mi opción, ya que todavía no sé cómo usar DecimalFormat :) ¡Gracias!
via_point

No he hecho mucho trabajo en Java en mucho tiempo, y cuando seguí viendo DecimalFormatrespuestas, inmediatamente pensé que estaba equivocado, pero gracias por aclarar eso.
Anthony Forloney

9
agregar df.setMinimumFractionDigits(2);para forzar dos dígitos
Terel

88

Sugeriría usar String.format () si necesita el valor como Stringen su código.

Por ejemplo, puede usar String.format()de la siguiente manera:

float myFloat = 2.001f;

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

14
"% .02f" y "% .2f" es lo mismo
Borzh

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

55
Hola Kevin, si ingreso 10.0000, solo obtengo 10. Si quiero mostrar 10.00, ¿cómo puedo hacerlo?
Mdhar9e

2
@ Uso de Mdhar9eDecimalFormat 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

44
Dependiendo de la ubicación, puede obtener una coma. Si desea un separador de puntos, use esto: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM

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

La salida es de 22.35. Si necesita 3 puntos decimales cámbielo a "% .3f".



9

Un truco simple es generar una versión más corta de su variable multiplicándola, por ejemplo 100, redondeándola y dividiéndola 100.0nuevamente. De esta manera genera una variable, con 2 decimales :

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

Este "truco barato" siempre fue lo suficientemente bueno para mí y funciona en cualquier idioma (no soy una persona Java, solo lo estoy aprendiendo).


1
Esto está mal, muchos números serán números repetitivos en representación flotante después de dividir por 100. Por lo tanto, no dos decimales.
mate

8

Puede usar estos códigos rápidos a continuación que se modificaron al final. Agregue cuántos ceros se refiere después del punto

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

La variable y1 era igual a 0.123456789 antes. Después del código, solo se convierte en 0.12 .


2
No muestra 0 antes del punto. Debe ser DecimalFormat df = new DecimalFormat ("0.00");
Ridhuvarshan

¡Sin lugar a duda! ¡DecimalFormat ("0.00") también funcionará! Gran lugar
Bahía

6

Mira DecimalFormat

Aquí hay un ejemplo del tutorial:

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

Si elige un patrón como "###. ##", obtendrá dos decimales, y creo que los valores se redondean. Deberá mirar el enlace para obtener el formato exacto que desea (por ejemplo, si desea ceros finales)


5

A continuación se muestra el código de cómo puede mostrar una salida de datos flotantes con 2 decimales en Java:

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

3

OK - str para flotar.

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

  }
}

Salida:

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

1

pequeño programa simple para demostración:

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

Simplemente, String str = System.out.printf("%.2f", val).replace(",", ".");si desea asegurarse de que independientemente de la configuración regional del usuario, siempre obtendrá / mostrará un "." como separador decimal Esto es imprescindible si no desea hacer que su programa se bloquee si luego realiza algún tipo de conversión comofloat f = Float.parseFloat(str);


1

Un problema que me tuvo durante una hora o más, encendido DecimalFormat: maneja las entradas dobles y flotantes de manera diferente. Incluso el cambio de RoundingMode no ayudó. No soy un experto, pero pensé que podría ayudar a alguien como yo. Terminé usando en su Math.roundlugar. Vea abajo:

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

Salida:

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

Prueba esto:-

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


 }

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.