Java'da 2 ondalık basamaklı bir şamandıra nasıl yazdırılır?


Yanıtlar:


250

printfYöntemi şu şekilde kullanabilirsiniz :

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

Kısaca, %.2fsözdizimi Java'ya biçim belirtecinin ( ) başlangıcından itibaren bir kayan nokta sayısının ( ) ondalık gösterimi valile değişkeninizi ( ) 2 ondalık basamakla ( .2) döndürmesini söyler .f%

Bunların yanı sıra kullanabileceğiniz başka dönüşüm karakterleri de vardır f:

  • d: ondalık tam sayı
  • o: sekizli tam sayı
  • e: bilimsel gösterimde kayan nokta

14
Lütfen String.format geçerli Yerel yapılandırmanıza bağlı olduğundan dikkatli olun, ayırıcı olarak nokta alamayabilirsiniz. Kullanmayı tercih etString.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino Neden olmasın Locale.FRANCE?
erickson

3
@gomino Kesinlikle. Öyleyse neden Fransız kullanıcılar için rakamlar koyuyorsunuz?
erickson

1
Bu yorumu, her zaman ayırıcı olarak bir nokta olmasını bekleyen insanları uyarmak için bir hatırlatma olarak ekledim.
Gomino

6
@gomino Bu mantıklı, ama ben zor kodlamayı "tercih" Locale.USçok ileri gidiyor düşünüyorum. Büyük / küçük harf katlama, sayı oluşturma vb Locale.ROOT. İçin "nötr" bir yerel ayarı kodlamanız gerekiyorsa, belirtin . Bu, insan kullanıcılar için değil, başka bir program tarafından tüketilecek metinler için uygun olacaktır. Bir kullanıcıya sunulan metin için, açıkça belirttikleri ya da varsayılan olduğu için yerel ayarlarına uyun.
erickson

179

Kullanabilirsiniz DecimalFormat. Kullanmanın bir yolu:

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

Bir diğeri #.##formatı kullanarak inşa etmektir .

Tüm biçimlendirme seçeneklerini biçimlendirme yöntemlerini çağırmaktan daha az okunabilir buluyorum, ancak bu bir tercih meselesi.


11
System.out.printf("%.2f", value)Sözdizimine ne oldu ? Hala buralarda mı?
Anthony Forloney

6
bu. bu hala bir seçenek - cevabınızı geri alabilirsiniz;)
Bozho

DecimalFormat'ı nasıl kullanacağımı henüz bilmediğim için bu benim seçeneğim gibi görünüyor :) Teşekkürler!
via_point

Bir süredir kapsamlı Java çalışması yapmadım ve DecimalFormatcevapları görmeye devam ettiğimde hemen yanlış olduğumu düşündüm, ama bunu açıkladığınız için teşekkür ederim.
Anthony Forloney

9
df.setMinimumFractionDigits(2);iki basamak zorlamak için ekle
Terel

88

Kodunuzda bir değere ihtiyacınız varsa String.format () kullanmanızı öneririm String.

Örneğin String.format(), aşağıdaki şekilde kullanabilirsiniz:

float myFloat = 2.001f;

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

14
"% .02f" ve "% .2f" aynı şeydir
Borzh

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

5
Merhaba Kevin, eğer 10.0000 girin, ben sadece 10 alıyorum. 10.00 görüntülemek istersem nasıl yapabilirim?
Mdhar9e

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
Yerel ayara bağlı olarak virgül alabilirsiniz. Nokta ayırıcı istiyorsanız, şunu kullanın: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM

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

Çıktı 22.35. 3 ondalık basamağa ihtiyacınız varsa "% .3f" olarak değiştirin.



9

Basit bir hile, değişkeninizin daha kısa bir versiyonunu, örneğin 100yuvarlayarak ve 100.0tekrar bölerek üretmektir . Bu şekilde 2 ondalık basamaklı bir değişken oluşturursunuz :

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

Bu "ucuz numara" benim için her zaman yeterince iyiydi ve herhangi bir dilde çalışıyor (ben bir Java insanı değilim, sadece öğreniyorum).


1
Bu yanlıştır, 100'e bölündükten sonra birçok sayı kayan sayı temsilinde tekrarlanır. Bu nedenle iki ondalık basamak olmaz.
matt

8

Aşağıda, sonunda kendini değiştiren bu hızlı kodları kullanabilirsiniz. Noktadan sonra ne kadar sıfır ifade ettiğini ekleyin

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

Y1 değişkeni daha önce 0.123456789'a eşitti . Koddan sonra sadece 0.12'ye dönüşür .


2
Bu noktadan önce 0 göstermez. DecimalFormat olmalıdır df = yeni DecimalFormat ("0.00");
Ridhuvarshan

Kesinlikle! DecimalFormat ("0.00") da çalışır! Harika bir yer.
Bay

6

DecimalFormat'a bakın

İşte öğreticiden bir örnek:

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

"###. ##" gibi bir desen seçerseniz, iki ondalık basamak elde edersiniz ve bence değerler yuvarlanır. Tam olarak istediğiniz biçimi elde etmek için bağlantıya bakmak isteyeceksiniz (örn. Sondaki sıfırları isteyip istemediğiniz)


5

Java'da 2 ondalık basamağı olan bir kayan noktalı veri çıktısını nasıl görüntüleyebileceğinize ilişkin kod aşağıdadır:

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

3

Tamam - yüzmek için str.

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

  }
}

Çıktı:

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

1

gösteri için küçük basit bir program:

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

Sadece String str = System.out.printf("%.2f", val).replace(",", ".");kullanıcının Yerel ayarından bağımsız olarak, her zaman bir "." ondalık ayırıcı olarak. Daha sonra gibi bir tür dönüşüm yaparsanız programınızın çökmesini istemiyorsanız bu bir zorunluluktur.float f = Float.parseFloat(str);


1

Beni bir saat veya daha fazla tutan bir sorun, DecimalFormat- Çift ve şamandıra girdileri farklı ele alır. Hatta değişiklik RoundingMode yardım etmedi. Uzman değilim ama bunun benim gibi birine yardımcı olabileceğini düşündüm. Math.roundBunun yerine kullanarak sona erdi . Aşağıya bakınız:

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

Çıktı:

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

Bunu dene:-

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


 }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.