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

부동 소수점을 “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

.



답변

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

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

선적 서류 비치


답변

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

편집 :


답변

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

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

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


답변

참고로 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));


답변

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

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

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


답변

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

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 부동 소수점 구현은 반올림을 수행하지만 소수점 반올림이 아닌 이진 반올림을 수행합니다. 그래서 당신은 아마 괜찮아


답변

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