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
Anthony Forloney
źródło
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.

Bozho
źródło
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);
John P.
źródło
14
„% .02f” i „% .2f” to to samo
Borzh
40
double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
Kevin Sylvestre
źródło
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
Phan Van Linh
źródło
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”.

Aldin Philo
źródło
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ę).

Birk
źródło
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 .

Zatoka
źródło
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)

Uri
źródło
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
Keshav Gera
źródło
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)

źródło
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);
    }
}
Pavan vadrevu
źródło
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);

Paul Efford
źródło
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
użytkownik2984447
źródło
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);
      }


 }
Oprogramowanie Nathani
źródło
Aby uzyskać więcej informacji: - makecodesimpleandeasy.blogspot.com/2019/08/…
Nathani Software