부동 소수점을 n 소수점 이하 자릿수로 포맷


220

부동 소수점을 "n"소수점으로 형식화해야합니다.

BigDecimal을 시도했지만 리턴 값이 올바르지 않습니다 ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

내가 지정한 소수 자릿수와 함께 float 값을 반환해야합니다.

Float가치 반환이 필요 하지 않습니다Double

.

답변:


561

float 값을 전달하고 다음을 사용할 수도 있습니다.

String.format("%.2f", floatValue);

선적 서류 비치


70
String.format은 현재 로컬 구성에 따라 다르므로 점으로 구분 기호를 얻지 못할 수 있습니다. 선호하는String.format(java.util.Locale.US,"%.2f", floatValue);
Gomino

6
이 대답은 Float 값이 아닌 String 값을 제공하지만 좋은 대답은 아닙니다.
ZhaoGang

3
점을 구분 기호로 사용하는 이유는 무엇입니까?
Mark Buikema

1
@MarkBuikema 표준과 같은 문서 형식을 컴파일 할 때와 같이 절대적으로 필요한 경우가 있다고 생각합니다. PDF 문서.
Tjaart

39

DecimalFormat을 살펴보십시오 . 쉽게 사용하여 숫자를 가져 와서 소수점 이하 자릿수를 지정할 수 있습니다.

편집 :


1
+1. 다음은 Android 관련 설명서 이며 기본적으로 동일해야합니다.
Zach L

그러나 결과는 문자열이 아닌 부동 숫자가 필요합니다.
seba123neo

플로트를 둥글게하고 싶다고 말하는가? 일반적으로 부동 소수점의 유일한 시간 정밀도는 표시 용입니다.
Nick Campion 2014 년

죄송합니다. 맞습니다. 혼란 스러웠습니다. 화면에 표시 될 때 숫자를 표시하십시오.
seba123neo

참고로 DecimalFormat생성자를 사용 하지 않는 것이 좋습니다 NumberFormat. 의 올바른 사용법은 대답을 참조하십시오 .
FBB

17

이것을 시도해보십시오.이게 많은 도움이되었습니다.

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

결과는 준결승입니다-가격-> 5652.26


2
이것은 반올림하여 추가 계산을 수행하려는 사람들에게 더 유용합니다. 그렇지 않으면 Arve의 대답이 가장 좋습니다.
Gerard

이것은 GWT에서도 작동합니다. String.format ()-그렇지 않습니다.
AlexV

15

참고로 DecimalFormat생성자의 사용 은 권장되지 않습니다. 이 클래스의 javadoc은 다음과 같이 말합니다.

NumberFormat 팩토리 메소드는 DecimalFormat 이외의 서브 클래스를 돌려 줄 가능성이 있기 때문에, 일반적으로 DecimalFormat 생성자를 직접 호출하지 말아주세요.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

따라서 당신이해야 할 일은 (예를 들어)입니다.

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));

floatValue = 8.499 인 경우 작동하지 않습니다. 8.5를주고있다.
시바 크리슈나 치파

3
@ShivakrishnaChippa : 그렇습니다. 여기서는 쉼표 뒤에 2 자리 숫자를 원하고 반올림하도록 지정하기 때문입니다. 이 경우 8.499는 8.5로 반올림됩니다. 8.499를 표시하려면 3을 최대 분수로 설정하십시오.
FBB

6

다음 DecimalFormat은 Nick이 언급 한 클래스를 사용하는 간단한 샘플 입니다.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

인쇄 문의 출력은 12.35입니다. 그것은 당신을 위해 그것을 반올림합니다.


참고로 DecimalFormat생성자의 사용 은 권장되지 않습니다 NumberFormat. 의 올바른 사용법은 대답을 참조하십시오 .
FBB

5

킨다는 아무도 그것을 직접 할 수있는 방법을 지적하지 않았다는 것에 놀랐습니다.

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

그래도 반올림하지는 않습니다.

가치가있는 경우, 반올림 반올림은 이진 기반 부동 소수점 값을 10 진 산술과 혼합 할 때마다 혼란스럽고 예측할 수 없습니다. 나는 그것을 할 수 없다고 확신합니다. 기본 문제는 1.105와 같은 값을 부동 소수점으로 정확하게 표현할 수 없다는 것입니다. 부동 소수점 값은 1.105000000000001 또는 1.104999999999999와 같습니다. 따라서 반올림을 시도하면 표현 인코딩 오류가 발생합니다.

IEEE 부동 소수점 구현은 반올림을 수행하지만 소수점 반올림이 아닌 이진 반올림을 수행합니다. 그래서 당신은 아마 괜찮아


나는 또한이 방법을 잠시 동안 사용했지만 pow반올림에 사용하기에는 너무 비싼 작업 이라고 생각 합니까?
Xerus

실제로 성능 문제가 발생할 때까지 최적화하지 마십시오. 빠른 것보다 옳은 것이 더 중요합니다. 그리고 나는 당신이 Visa 나 Mastercard (단지 더 많은 기계를 던질 것)가 아니라면 제어 된 반올림 성능이 문제가되는 응용 프로그램을 솔직하게 상상할 수 없습니다. 그리고 pow ()는 round ()보다 빠를 것입니다.
로빈 데이비스

2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }

2

이것은 훨씬 덜 전문적이고 훨씬 비싼 방법이지만 초보자에게는 이해하기 쉽고 도움이되어야합니다.

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}

1

나는 당신이 원하는 것이 아닌 것 같아요

return value.toString();

리턴 값을 사용하여 표시하십시오.

value.floatValue();

주로 무언가를 계산하는 데 사용되기 때문에 항상 625.3을 반환합니다.


그러나 결과는 문자열이 아닌 부동 숫자가 필요합니다.
seba123neo

2
사용자에게 표시하기 위해 float가 필요한 경우 응용 프로그램 디자인에 문제가있을 수 있습니다. 일반적으로 float는 계산에 사용되고 문자열은이를 사용자에게 표시하는 데 사용됩니다.
n3utrino

죄송합니다. 맞습니다. 혼란 스러웠습니다. 화면에 표시 될 때 숫자를 표시하십시오.
seba123neo

1

나는이 질문에 대한 답을 찾고 있었고 나중에 방법을 개발했습니다! :) 공정한 경고, 가치를 반올림합니다.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.