programing

소수점 자리 n개로 부동 소수점 형식 지정

prostudy 2022. 5. 6. 19:46
반응형

소수점 자리 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값을 반환하지 않음Double

.

부동액 값을 전달하고 다음을 사용하십시오.

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

문서화

DecimumFormat을 참조하십시오.쉽게 숫자를 취해서 소수 자릿수를 정해서 줄 수 있다.

편집: 예제

이것 좀 써봐. 나한테 많은 도움이 많이 되었어.

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

결과는 라운드 파이널 프라이스 -> 5652가 될 것이다.26

특히, 의 사용DecimalFormat건설업자가 낙담하다이 클래스의 자바독에는 다음과 같이 명시되어 있다.

일반적으로 10진수 형식 생성자를 직접 호출하지 마십시오(숫자).포맷 공장 방법은 십진 포맷 이외의 하위 클래스를 반환할 수 있다.

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닉이 언급한 수업

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

이것은 훨씬 덜 전문적이고 훨씬 더 비싸지만 초보자들에게는 더 이해하기 쉽고 더 도움이 될 것이다.

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

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

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}

네가 원하는 건 그렇지 않은 것 같아.

return value.toString();

반환 값을 사용하여 표시하십시오.

value.floatValue();

주로 어떤 것을 계산하는 데 사용되기 때문에 항상 625.3을 반환할 것이다.

숫자를 문자열로 포맷하려면 다음과 같이 십진 형식을 사용하십시오.

String a = "123455";
System.out.println(new 
DecimalFormat(".0").format(Float.valueOf(a)));

이 코드의 출력은 다음과 같다.

123455.0

원하는 출력에 따라 더 많은 0을 소수점 형식에 추가할 수 있다.

참조URL: https://stackoverflow.com/questions/5195837/format-float-to-n-decimal-places

반응형