Java에서 소수점 이하 두 자리로 부동 소수점을 인쇄하는 방법은 무엇입니까?


답변:


250

다음 printf과 같이 방법을 사용할 수 있습니다 .

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

간단히 말해서 %.2f구문은 Java에게 형식 지정자 ( ) 의 시작 부분에서 부동 소수점 숫자 ( )를 십진수로 표현 하여 변수 ( val)를 소수점 2 자리 ( ) 로 반환하도록 지시 합니다 ..2f%

이외에도 사용할 수있는 다른 변환 문자가 있습니다 f.

  • d: 십진 정수
  • o: 8 진 정수
  • e: 과학적 표기법의 부동 소수점

13
String.format은 현재 로컬 구성에 따라 다르므로 점이 구분 기호로 표시되지 않을 수 있습니다. 선호하는String.format(java.util.Locale.US,"%.2f", val);
Gomino

1
@gomino 왜 안돼 Locale.FRANCE?
erickson

3
@gomino 정확합니다. 그렇다면 프랑스 사용자에게 왜 점을 숫자로 표시 하시겠습니까?
erickson

1
필자는 항상 점을 구분 기호로 사용할 것으로 예상되는 사람들에게 경고하기 위해이 주석을 추가했습니다.
Gomino

6
@gomino 그건 말이 되긴하지만, 하드 코딩을 "바람직하게"하는 것이 Locale.US너무 멀다고 생각합니다 . 대 / 소문자 구분, 숫자 렌더링 등을 위해 "중립"로캘을 하드 코딩해야하는 경우을 지정하십시오 Locale.ROOT. 이는 사용자에게 렌더링되지 않고 다른 프로그램에서 사용되는 텍스트에 적합합니다. 사용자에게 표시되는 텍스트의 경우 명시 적으로 지정했는지 또는 기본 설정인지에 관계없이 해당 로케일을 존중하십시오.
erickson

179

사용할 수 있습니다 DecimalFormat. 그것을 사용하는 한 가지 방법 :

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

다른 하나는 #.##형식을 사용하여 구성하는 것 입니다.

모든 형식 지정 옵션을 형식 지정 메서드를 호출하는 것보다 읽기 쉽지 않지만 선호하는 문제입니다.


11
무엇이 일어난 System.out.printf("%.2f", value)구문? 아직도 주변에 있습니까?
Anthony Forloney

6
그것은. 그것은 여전히 ​​옵션입니다-당신은 당신의 답변을 삭제 취소 할 수 있습니다;)
Bozho

DecimalFormat을 사용하는 방법을 아직 모르기 때문에 내 옵션 인 것 같습니다 :) 감사합니다!
via_point

나는 한동안 광범위한 Java 작업을 수행하지 않았으며 DecimalFormat답변을 계속 보았을 때 즉시 내가 틀렸다고 생각했지만 분명히 설명해 주셔서 감사합니다.
Anthony Forloney

9
추가 df.setMinimumFractionDigits(2);두 자리를 강제로
Terel

88

코드에서 와 같이 값이 필요한 경우 String.format ()을 사용하는 것이 좋습니다 String.

예를 들어 String.format()다음과 같은 방식으로 사용할 수 있습니다 .

float myFloat = 2.001f;

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

14
"% .02f"와 "% .2f"도 같은 것입니다
Borzh

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

5
안녕하세요 케빈, 10.0000을 입력하면 10 만 받고 있습니다. 10.00을 표시하려면 어떻게해야합니까?
Mdhar9e

2
@ Mdhar9e 사용DecimalFormat 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
로케일에 따라 쉼표가 표시 될 수 있습니다. 점 구분 기호를 원하는 경우 다음을 사용하십시오. DecimalFormat ( "#. ##", DecimalFormatSymbols (Locale.US))
DPM

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

출력은 22.35입니다. 소수점 3 자리가 필요한 경우 "% .3f"로 변경하십시오.



9

간단한 트릭은 예를 들어 변수를 곱하고 100반올림 한 다음 100.0다시 나눔으로써 더 짧은 버전의 변수를 생성하는 것입니다 . 이 방법으로 소수점 이하 두 자리 로 변수를 생성합니다 .

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

이 "저렴한 속임수"는 항상 저에게 충분했으며 어떤 언어로든 작동합니다 (저는 Java를 배우지 않고 배우는 것입니다).


1
이것은 잘못된 것입니다. 100으로 나눈 후 많은 숫자가 부동 소수점 표현으로 숫자를 반복합니다. 따라서 소수점 이하 두 자리가 아닙니다.
matt

8

마지막에 변경된 빠른 코드를 아래에서 사용할 수 있습니다. 포인트 뒤의 숫자를 0으로 추가하십시오.

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

변수 y1은 전에 0.123456789같았습니다 . 코드 후에는 0.12 로만 바뀝니다 .


2
포인트 앞에 0을 표시하지 않습니다. DecimalFormat이어야합니다. df = new DecimalFormat ( "0.00");
Ridhuvarshan

확실히! DecimalFormat ( "0.00")도 작동합니다! 그레이트 스팟.
베이

6

DecimalFormat을 보십시오

다음은 튜토리얼의 예입니다.

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

"###. ##"과 같은 패턴을 선택하면 소수점 이하 두 자리가 나오고 값이 반올림된다고 생각합니다. 원하는 정확한 형식을 얻기 위해 링크를보고 싶을 것입니다 (예 : 후행 0을 원하는지 여부)


5

다음은 Java에서 소수점 이하 2 자리로 부동 소수점 데이터의 출력을 표시하는 방법입니다.

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

3

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

  }
}

산출:

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

1

데모를위한 작은 간단한 프로그램 :

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

그냥 할 String str = System.out.printf("%.2f", val).replace(",", ".");독립적으로 사용자의 로케일의 사항을 확인하려는 경우, 당신은 항상 / 디스플레이 a를 얻을 것이다 "." 소수점 구분 기호로. 나중에 같은 종류의 변환을 수행하는 경우 프로그램 충돌을 일으키지 않으려면 필수입니다.float f = Float.parseFloat(str);


1

한 시간 이상 동안 문제가 발생한 한 가지 문제 DecimalFormat-이중 및 부동 입력을 다르게 처리합니다. RoundingMode의 변경조차도 도움이되지 않았습니다. 나는 전문가는 아니지만 그것이 나와 같은 누군가를 도울 수 있다고 생각했습니다. Math.round대신에 사용 했습니다. 아래를보십시오 :

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

산출:

Double 0.7750 -> 0.78
Float 0.7750f -> 0.77

Rounding Up Double 0.7750 -> 0.78
Rounding Up Float 0.7750f -> 0.77

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.