Jak wydrukować liczbę zmiennoprzecinkową z 2 miejscami dziesiętnymi w Javie?


Odpowiedzi:


250

Możesz użyć tej printfmetody:

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

Krótko mówiąc, %.2fskładnia mówi Javie, aby zwróciła zmienną ( val) z 2 miejscami dziesiętnymi ( .2) w postaci dziesiętnej liczby zmiennoprzecinkowej ( f) od początku specyfikatora formatu ( %).

Oprócz innych znaków konwersji możesz użyć f:

  • d: liczba całkowita dziesiętna
  • o: ósemkowa liczba całkowita
  • e: zmiennoprzecinkowy w notacji naukowej

13
Zachowaj ostrożność, ponieważ String.format zależy od bieżącej konfiguracji lokalnej, możesz nie otrzymać kropki jako separatora. Wolę używaćString.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino Dlaczego nie Locale.FRANCE?
erickson

3
@gomino Dokładnie. Dlaczego więc wstawiałbyś kropki w liczbach dla francuskich użytkowników?
erickson

1
Dodałem ten komentarz jako przypomnienie, aby ostrzec ludzi, którzy oczekują, że kropka będzie zawsze separatorem.
Gomino

6
@gomino To ma sens, ale myślę, że „preferowanie” kodowania na sztywno Locale.USidzie za daleko. Jeśli potrzebujesz zakodować na stałe „neutralne” ustawienia regionalne dla składania spraw, renderowania liczb itp., Podaj Locale.ROOT. Byłoby to odpowiednie dla tekstu, który zostanie zużyty przez inny program, a nie renderowany dla użytkowników. W przypadku tekstu prezentowanego użytkownikowi należy uszanować jego ustawienia narodowe, niezależnie od tego, czy podano go wyraźnie, czy jest to ustawienie domyślne.
erickson

179

Możesz użyć DecimalFormat. Jednym ze sposobów użycia:

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

Innym jest zbudowanie go przy użyciu #.##formatu.

Uważam, że wszystkie opcje formatowania są mniej czytelne niż wywoływanie metod formatowania, ale jest to kwestia preferencji.


11
Co się stało ze System.out.printf("%.2f", value)składnią? Czy nadal jest w pobliżu?
Anthony Forloney

6
to jest. to wciąż opcja - możesz cofnąć usunięcie swojej odpowiedzi;)
Bozho

Wygląda na to, że to moja opcja, ponieważ nie wiem jeszcze, jak korzystać z DecimalFormat :) Dzięki!
via_point

Od dłuższego czasu nie wykonałem obszernej pracy nad Javą, a kiedy wciąż widziałem DecimalFormatodpowiedzi, od razu pomyślałem, że się mylę, ale dziękuję za wyjaśnienie.
Anthony Forloney

9
dodaj df.setMinimumFractionDigits(2);do siły dwie cyfry
Terel

88

Sugerowałbym użycie String.format (), jeśli potrzebujesz wartości jako Stringw swoim kodzie.

Na przykład możesz użyć String.format()w następujący sposób:

float myFloat = 2.001f;

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

14
„% .02f” i „% .2f” to to samo
Borzh

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

5
Cześć Kevin, jeśli wprowadzę 10,0000, dostaję tylko 10. Jeśli chcę wyświetlić 10,00, jak mogę to zrobić?
Mdhar9e

2
@ Zastosowanie 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

4
W zależności od ustawień regionalnych może pojawić się przecinek. Jeśli chcesz separator kropek, użyj tego: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM

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

Wyjście wynosi 22,35. Jeśli potrzebujesz 3 miejsc po przecinku, zmień go na „% .3f”.



9

Prostą sztuczką jest wygenerowanie krótszej wersji zmiennej przez pomnożenie jej przez np. 100Zaokrąglenie i 100.0ponowne podzielenie . W ten sposób generujesz zmienną z 2 miejscami po przecinku :

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

Ta „tania sztuczka” zawsze była dla mnie wystarczająca i działa w dowolnym języku (nie jestem osobą Java, tylko się jej uczę).


1
To źle, wiele liczb będzie powtarzać liczby w postaci liczb zmiennoprzecinkowych po podzieleniu przez 100. Stąd nie dwa miejsca po przecinku.
mat

8

Możesz użyć tych szybkich kodów poniżej, które zmieniły się na końcu. Dodaj, ile zer odnosi się do kropki po punkcie

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

Zmienna y1 była wcześniej równa 0,123456789 . Po kodzie zmienia się tylko w 0.12 .


2
Nie wyświetla 0 przed punktem. Powinien to być DecimalFormat df = new DecimalFormat („0,00”);
Ridhuvarshan

Na pewno! Działa również DecimalFormat („0,00”)! Świetne miejsce.
Zatoka

6

Spójrz na DecimalFormat

Oto przykład z samouczka:

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

Jeśli wybierzesz wzór taki jak „###. ##”, otrzymasz dwa miejsca po przecinku i myślę, że wartości są zaokrąglane w górę. Będziesz chciał spojrzeć na link, aby uzyskać dokładnie taki format, jaki chcesz (np. Czy chcesz końcowe zera)


5

Poniżej znajduje się kod, w jaki sposób wyświetlić dane wyjściowe danych zmiennoprzecinkowych z 2 miejscami dziesiętnymi w Javie:

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

3

OK - str do pływania.

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

  }
}

Wynik:

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

1

mały prosty program do demonstracji:

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

Po prostu zrób, String str = System.out.printf("%.2f", val).replace(",", ".");jeśli chcesz mieć pewność, że niezależnie od ustawień regionalnych użytkownika, zawsze otrzymasz / wyświetlisz „.” jako separator dziesiętny. Jest to konieczne, jeśli nie chcesz powodować awarii programu, jeśli później wykonasz jakąś konwersjęfloat f = Float.parseFloat(str);


1

Jeden problem, który miał mnie przez godzinę lub dłużej DecimalFormat- Włącza podwójne i zmienne wejście danych inaczej. Nawet zmiana RoundingMode nie pomogła. Nie jestem ekspertem, ale pomyślałem, że to może pomóc komuś takiemu jak ja. Skończyło się na tym Math.roundzamiast. Patrz poniżej:

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

Wynik:

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

Spróbuj tego:-

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


 }

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.