[Java] 소수점을 %로 변경하는 두가지 방법

    자바(Java)에서 숫자를 퍼센트(%) 형식으로 표시하려면 일반적으로 NumberFormat 형식과 고전적으로 값을 곱하는 방식이 존재하는데요. 두가지의 방법의 차이와 NumberFormat 사용법에 대해서 알려드리도록 하겠습니다.

     

    비교할 데이터

    public class TestMain {
    
        public static void main(String[] args) {
            double a = 0.23;
            double b = 0.045;
            double c = 0.00713;
        }
    }

     

    명확한 값의 차이를 알기 위해, 위와 같이 3가지의 값을 지정해봤습니다. 

     

    고전적인 방식

    퍼센트값은 당연하게도 0~1의 사이인 값으로 되어 있습니다. 이렇게 값이 정해져있기 때문에 퍼센트로 치환하는 방식 역시 생각보다 쉬울 수 있는데요.

     

    /**
     * 고전적인 방법
     */
    public static void type1(double value) {
        int quoatient = (int)(value * 100);
        System.out.println("type1->" + quoatient + "%");
    }

     

    위와 같이 double 형태의 값에 100을 곱해주면 됩니다. 이 방식은 간단하게 퍼센트를 구할수 있는 장점이 있지만, 핸들링을 하려면 복잡해 지는 문제가 있는데요. 

     

    자바는 내장 함수로 이를 쉽게 핸들링할 수 있는 NumberFormat이라는 클래스를 제공해 줍니다.

     

    NumberFormat 방식

    넘버 포맷 방식은 퍼센트(%) 뿐만 아니라 각국의 통화, 소수 등의 형식으로 포맷하는 메소드를 제공하는데요. 본 포스팅은 퍼센트만 구할 예정이니 해당 방식을 사용법을 알아보도록 하겠습니다.

     

    /**
     * NumberFormat 방법
     */
    public static void type2(double value) {
        // NumberFormat에서 퍼센트 인스턴스를 가져온다
        NumberFormat percentFormat = NumberFormat.getPercentInstance();
    
        // 소수점 아래 자릿수 설정
        percentFormat.setMinimumFractionDigits(0);  // 최소 자리수
        percentFormat.setMaximumFractionDigits(0);  // 최대 자리수
    
        String formatted = percentFormat.format(value);
        System.out.println("type2->" + formatted);
    }

     

    간단하게 소수값에 100을 곱했던 이전 방식보다 복잡해 보이는 느낌이 있습니다.

    하지만 사용해보면 얼마나 강력한지 알 수 있을 것입니다.

     

    테스트

    메소드로 만든 2개의 방식의 차이점을 비교해보도록 하겠습니다.

     

    public static void main(String[] args) {
        double a = 0.23;
        double b = 0.045;
        double c = 0.00713;
    
        type1(a);
        type2(a);
    
        type1(b);
        type2(b);
    
        type1(c);
        type2(c);
    }

     

     

    테스트 1 결과

    type1->23%
    type2->23%
    type1->4%
    type2->4%
    type1->0%
    type2->1%

     

    테스트 1의 경우 대개 유사하지만, 마지막 0.00713이라는 값의 경우 type1은 0이라는 값이 나왔고, type2는 1%라는 값이 나온 것을 알 수 있는데요. 즉, NumberFormat 방식은 반올림이 알아서 적용된다는 것을 알 수 있습니다.

     

    그리고 퍼센트에서도 나머지 소수점을 표현할 수 있는데요. 예를 들어, 0.2345 라는 값이 있을 경우 23.45%와 같이 두자리수까지 표현하는 케이스는 첫번째 방식으로 구현하는 방식이 복잡해집니다. 하지만 NumberFormat은 설정값만 변경하면 끝입니다.

     

    percentFormat.setMaximumFractionDigits(2);

     

    위와 같이 최대 자리수를 지정하면 되는데요. 위와 같이 최대자리수를 2로 지정할 경우 어떻게 결과가 나오는지 다시 한번 호출해보겠습니다.

     

    테스트 2 결과

    type1->23%
    type2->23%
    type1->4%
    type2->4.5%
    type1->0%
    type2->0.71%

     

    최대 소수점 자리수를 2로 지정한 결과 위와 같이 4% -> 4.5%, 1% -> 0.71%로 전혀 다르게 나온 것을 확인할 수 있습니다. 즉, 확률, 비율 등으로 퍼센트를 사용해야 할 경우에는 복잡하게 고전 방식으로 구현하지 말고, NumberFormat을 사용하는 것을 권유드립니다.

    반응형

    댓글

    Designed by JB FACTORY