JAVA

Java 실수형 자료 계산하기

Ambitions 2021. 6. 8. 17:58

백준문제들을 풀다보면, 실수로 결과 값이 나오고 특정 소수점자리에서 반올림하는 문제들이 종종 있는데, 회사에서 개발을 할 때는 안정적인 BigDecimal 자료형을 이용해서 계산했는데(보통 회사에서 무언가를 계산하는 경우에는 정확한 값이 필요하기때문에 필수적으로 BigDecimal을 이용해야함) BigDecimal을 이용하면 속도가 느리다는 소리를 들은 것 같아서 알고리즘 문제를 풀때는 Double이나 Float을 이용하게 된다. (찾아보니 BigDecimal은 함수를 이용하여 계산하기 때문에 더 느리다고한다. / Number클래스를 상속받은 자식 클래스니까..)

 

여튼 문제에서는 결과 값을 소수점 셋째자리에서 반올림한 결과를 출력하라 였는데, 나는 떠올랐던 생각이 Math.round를 이용하는 것 이였기때문에 다음과 같이 작성했었다.

1
2
3
4
5
6
7
8
9
10
11
public class Main {
    public static main void(String[] args) {
        double sum = 350;
        double people = 5.0;
        
        //소수점 셋째자리까지 나오는걸 의도하고 1000을 곱하고 나눔
        double a = Math.round(sum / people) * 1000 / 1000.0
        System.out.println("result : " + a); // 결과는 => 70.0
    }
}
 
cs

분명 나는 소수점 셋째자리 까지 표시하고 싶어서 1000을 곱하고 나눴는데, 결과는 70.0이 나온 것이다, 

double형의 경우 소수점 자리가 0인경우에는 절삭하기때문에 다른방법을 찾아야 했고, 그래서 찾은 방법이 String.format이였다.

String.format을 이용하면 다음과 같이 짜면된다.(출력만 할거면 printf를 이용해도 결과는 같음)

1
2
3
4
5
6
7
8
9
10
public class Main {
    public static main void(String[] args) {
        
        double sum = 350;
        double people = 5.0;
        String result = String.format("%.3f", sum / people);
        System.out.println("result : " + result); // 결과 70.000
    }
}
 
cs

추가적으로 정확한 연산을 필요로 할 때 BigDecimal을 다음과 같이 이용하면된다.

1
2
3
4
//add : 더하기, subtract : 빼기, multiply : 곱셈, divide : 나누기
BigDecimal sum = new BigDecimal(350);
BigDecimal people = new BigDecimal("5.0");
System.out.println(sum.divide(people, 3, BigDecimal.ROUND_HALF_UP)); // 소수점 셋째자리, 반올림
cs

여기까지 실수형 처리에 대해서 정리해보았다, 잊어먹지말고 필요할 때 잘 사용할 수 있으면 좋겠다.