Làm cách nào để in nổi với 2 chữ số thập phân trong Java?


Câu trả lời:


250

Bạn có thể sử dụng printfphương thức, như vậy:

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

Nói tóm lại, %.2fcú pháp yêu cầu Java trả về biến của bạn ( val) với 2 vị trí thập phân ( .2) dưới dạng biểu diễn thập phân của số dấu phẩy động ( f) từ đầu của trình xác định định dạng ( %).

Ngoài ra còn có các ký tự chuyển đổi khác mà bạn có thể sử dụng f:

  • d: số nguyên thập phân
  • o: số nguyên bát phân
  • e: dấu phẩy động trong ký hiệu khoa học

13
Xin hãy cẩn thận vì String.format phụ thuộc vào cấu hình Cục bộ hiện tại của bạn, bạn có thể không nhận được dấu chấm làm dấu phân cách. Thích sử dụngString.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@eimino Tại sao không Locale.FRANCE?
erickson

3
@eimino Chính xác. Vậy tại sao bạn lại đặt số chấm cho người dùng Pháp?
erickson

1
Tôi đã thêm nhận xét này như một lời nhắc nhở để cảnh báo những người mong muốn luôn có một dấu chấm làm dấu phân cách.
Gomino

6
@eimino Điều đó có ý nghĩa, nhưng tôi nghĩ để "thích" mã hóa cứng Locale.USđi quá xa. Nếu bạn cần mã hóa một miền địa phương "trung tính" để gấp chữ hoa, hiển thị số, v.v., hãy chỉ định Locale.ROOT. Điều này sẽ phù hợp với văn bản sẽ được sử dụng bởi một chương trình khác, thay vì được hiển thị cho người dùng. Đối với văn bản được trình bày cho người dùng, hãy tôn trọng ngôn ngữ của họ, cho dù họ chỉ định rõ ràng hay đó là mặc định.
erickson

179

Bạn có thể dùng DecimalFormat . Một cách để sử dụng nó:

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

Một cách khác là xây dựng nó bằng cách sử dụng #.##định dạng.

Tôi thấy tất cả các tùy chọn định dạng ít dễ đọc hơn gọi các phương thức định dạng, nhưng đó là vấn đề ưu tiên.


11
Điều gì đã xảy ra với System.out.printf("%.2f", value)cú pháp? Nó vẫn còn ở đây à?
Anthony Forloney

6
nó là. nó vẫn là một lựa chọn - bạn có thể phục hồi câu trả lời của bạn;)
Bozho

Có vẻ như đó là lựa chọn của tôi, vì tôi chưa biết cách sử dụng DecimalFormat :) Cảm ơn!
via_point

Tôi đã không thực hiện công việc Java rộng rãi trong một thời gian và khi tôi thấy DecimalFormatcâu trả lời tôi lập tức nghĩ rằng mình đã sai, nhưng cảm ơn bạn đã làm rõ điều đó.
Anthony Forloney

9
thêm df.setMinimumFractionDigits(2);vào lực lượng hai chữ số
Terel

88

Tôi sẽ đề nghị sử dụng String.format () nếu bạn cần giá trị dưới dạngString mã trong mã của mình.

Ví dụ: bạn có thể sử dụng String.format()theo cách sau:

float myFloat = 2.001f;

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

14
"% .02f" và "% .2f" là điều tương tự
Borzh

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

5
Xin chào Kevin, nếu nhập 10,00, tôi chỉ nhận được 10. Nếu tôi muốn hiển thị 10,00 thì tôi phải làm thế nào?
Mdhar9e

2
@ Mdhar9e sử dụngDecimalFormat 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
Tùy thuộc vào miền địa phương, bạn có thể nhận được dấu phẩy. Nếu bạn muốn phân tách dấu chấm, hãy sử dụng công cụ này: DecimalFormat ("#. ##", DecimalFormatSymbols (Locale.US))
DPM

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

Đầu ra là 22,35. Nếu bạn cần 3 điểm thập phân, hãy đổi thành "% .3f".



9

Một mẹo đơn giản là tạo ra một phiên bản ngắn hơn của biến của bạn bằng cách nhân nó với ví dụ 100, làm tròn nó và chia nó 100.0lại. Bằng cách này, bạn tạo một biến, với 2 chữ số thập phân :

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

"Thủ thuật rẻ tiền" này luôn đủ tốt cho tôi và hoạt động với bất kỳ ngôn ngữ nào (tôi không phải là người Java, chỉ học nó).


1
Điều này là sai, nhiều số sẽ lặp lại các số trong biểu diễn float sau khi bạn chia cho 100. Do đó không phải là hai chữ số thập phân.
matt

8

Bạn có thể sử dụng mã nhanh này bên dưới đã tự thay đổi vào cuối. Thêm bao nhiêu số không như tham chiếu sau điểm

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

Biến y1 là bằng 0,125456789 trước đó. Sau khi mã nó chỉ biến thành 0,12 .


2
Nó không hiển thị 0 trước điểm. Nó phải là DecimalFormat df = new DecimalFormat ("0,00");
Ridhuvarshan

Chắc chắn! DecimalFormat ("0,00") cũng sẽ hoạt động! Điểm tuyệt vời.
Bay

6

Nhìn vào DecimalFormat

Đây là một ví dụ từ hướng dẫn:

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

Nếu bạn chọn một mẫu như "###. ##", bạn sẽ nhận được hai chữ số thập phân và tôi nghĩ rằng các giá trị được làm tròn lên. Bạn sẽ muốn nhìn vào liên kết để có được định dạng chính xác mà bạn muốn (ví dụ: bạn có muốn các số 0 không


5

Dưới đây là mã làm thế nào bạn có thể hiển thị đầu ra của dữ liệu nổi với 2 vị trí thập phân trong Java:

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

3

OK - str để nổi.

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

  }
}

Đầu ra:

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

1

chương trình nhỏ đơn giản để trình diễ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

Chỉ cần làm String str = System.out.printf("%.2f", val).replace(",", ".");nếu bạn muốn đảm bảo rằng độc lập với Địa điểm của người dùng, bạn sẽ luôn nhận được / hiển thị "." như dấu phân cách thập phân. Đây là điều bắt buộc nếu bạn không muốn làm cho chương trình của mình bị sập nếu sau đó bạn thực hiện một số loại chuyển đổi nhưfloat f = Float.parseFloat(str);


1

Một vấn đề khiến tôi mất một giờ hoặc hơn, trên DecimalFormat- Nó xử lý các đầu vào kép và nổi khác nhau. Ngay cả thay đổi RoundingMode cũng không giúp được gì. Tôi không phải là chuyên gia nhưng nghĩ rằng nó có thể giúp một người như tôi. Đã kết thúc bằng cách sử dụng Math.roundthay thế. Xem bên dưới:

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

Đầu ra:

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

Thử cái này:-

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


 }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.