SIMPOLOR
단순하고 색있게
BigDecimal 클래스
단순색
·
2024년 10월 07일
Java
BigDecimal은 정확한 고정 소수점 숫자 연산을 제공하는 Java 클래스입니다. Java에서 `금융 계산이나 높은 정밀도가 요구되는 계산을 처리할 때 float 또는 double 자료형을 사용하는 것은 부적절`합니다. 그 이유는 두 자료형이 부동소수점 방식을 사용하기 때문에 소수점 이하의 값을 저장할 때 오차가 발생할 수 있기 때문입니다. ## BigDecimal 클래스란? BigDecimal은 Java에서 정확한 소수점 연산을 제공하는 클래스입니다. 특히 금융 계산이나 오차가 허용되지 않는 고정 소수점(decimal) 계산에서 유용합니다. 또한, BigDecimal은 **불변 객체(immutable object)**입니다. 즉, 값을 변경할 수 없으며, 연산 결과는 항상 새로운 BigDecimal 객체로 반환됩니다. ## BigDecimal 생성 예시 ### 문자열을 사용한 생성 ``` BigDecimal number = new BigDecimal("123.45"); ``` 문자열을 사용하는 것이 가장 안전한 방법입니다. 부동소수점의 오차 문제를 방지할 수 있습니다. ### 정수나 실수를 사용한 생성 ``` BigDecimal fromInt = new BigDecimal(123); BigDecimal fromDouble = new BigDecimal(123.45); ``` 정수를 사용하는 것은 안전하지만, double을 사용한 생성은 권장되지 않습니다. double 타입은 부동소수점 연산 방식으로 인해 정확한 값을 표현하지 못할 수 있습니다. ### valueOf 메소드 사용한 생성 ``` BigDecimal safeDecimal = BigDecimal.valueOf(123.45); ``` BigDecimal.valueOf(double)은 double을 안전하게 BigDecimal로 변환하는 방법입니다. 내부적으로 정확한 값을 보장하여 변환합니다. ## BigDecimal의 주요 메소드 ### 덧셈(add) ``` BigDecimal number1 = new BigDecimal("10.5"); BigDecimal number2 = new BigDecimal("20.3"); BigDecimal result = number1.add(number2); // 결과: 30.8 ``` ### 뺄셈(subtract) ``` BigDecimal number1 = new BigDecimal("10.5"); BigDecimal number2 = new BigDecimal("20.3"); BigDecimal result = number1.subtract(number2); // 결과: -9.8 ``` ### 곱셈(multiply) ``` BigDecimal number1 = new BigDecimal("10.5"); BigDecimal number2 = new BigDecimal("20.3"); BigDecimal result = number1.multiply(number1); // 결과: 213.15 ``` ### 나눗셈(divide) ``` BigDecimal number1 = new BigDecimal("10.5"); BigDecimal number2 = new BigDecimal("20.3"); BigDecimal result = number1.divide(number2, 2, RoundingMode.HALF_UP); // 결과: 0.52 (0.517241) ``` 나눗셈에서는 정확한 소수 자릿수와 반올림 방식을 지정해야 하며, 그렇지 않으면 ArithmeticException이 발생할 수 있습니다. ## 반올림 모드 BigDecimal은 다양한 반올림 모드를 제공합니다. 주로 사용되는 반올림 모드는 다음과 같습니다: - **RoundingMode.HALF_UP**: 가장 일반적인 반올림 방식으로, 소수점 0.5 이상은 올림합니다. - **RoundingMode.HALF_DOWN**: 소수점 0.5는 내림합니다. - **RoundingMode.UP**: 무조건 올림합니다. - **RoundingMode.DOWN**: 무조건 내림합니다. ``` BigDecimal rounded = number1.setScale(2, RoundingMode.HALF_UP); // 소수점 2자리에서 반올림 ``` setScale 메소드를 사용하여 원하는 소수 자릿수와 반올림 방식을 지정할 수 있습니다 ## BigDecimal 비교 BigDecimal 객체를 비교할 때는 equals() 메소드 사용을 피해야 합니다. BigDecimal은 소수점 자릿수까지 비교하기 때문에 값이 같아도 다른 결과를 반환할 수 있습니다. 대신, compareTo() 메소드를 사용하여 값을 비교해야 합니다. ``` BigDecimal number1 = new BigDecimal("10.00"); BigDecimal number2 = new BigDecimal("10.0"); System.out.println(number1.equals(number2)); // false System.out.println(number1.compareTo(number2)); // 0 (같음) ``` equals() 메소드는 소수점 자릿수까지 고려하여 값을 비교하지만, compareTo()는 값만 비교합니다. 따라서 두 값이 논리적으로 같다면 compareTo()는 0을 반환합니다. ### compareTo() 반환값 - **1**: number1이 number2보다 큽니다. - **0**: number1과 number2의 값이 같습니다. - **-1**: number1이 number2보다 작습니다. ## BigDecimal 나머지 메소드 - **max**: 두 값을 비교하여 더 큰 값을 반환 - **min**: 두 값을 비교하여 더 작은 값을 반환 - **doubleValue**: double 형으로 반환 - **floatValue**: float 형으로 반환 - **intValue**: int 형으로 반환 - **longValue**: long 형으로 반환 - **toString**: 10진법 문자로 반환 - **toString(n)**: n진법 문자로 반환 - **abs()**: 절대값으로 반환 - **pow(n)**: n승으로 반환 ## BigDecimal의 장점과 단점 ### 장점 - **정확한 소수점 연산**: 금융 계산에 적합. - **다양한 반올림 옵션**: 계산 결과를 세밀하게 제어 가능. ### 단점 - **성능**: float 또는 double보다 느림. - **복잡성**: 코드가 다소 복잡해질 수 있음. ## 마무리 소수점 연산의 정확성이 중요한 경우, Java에서 BigDecimal은 필수적인 클래스입니다. 금융 계산이나 고정 소수점 계산에서 오차 없이 결과를 얻을 수 있도록 도와줍니다. 다만 성능과 코드의 복잡성을 고려하여 신중하게 사용해야 합니다.
연관 포스트
Java jar 실행 옵션
다형성(Polymorphism)
캡슐화(Encapsulation)
추상화(Abstraction)
상속(Inheritance)