Java java.math 패키지의 BigDecimal 클래스
Java BigDecimal로 덧셈, 뺄셈, 곱셈, 나눗셈 그리고 반올림하는 방법 소개
BigDecimal 개요
Java를 사용해 부동 소수를 계산할 시에 BigDecimal
클래스를 사용해야 한다.
float
형이나double
형을 사용하면 오차가 발생할 가능성이 있다.
엄격한 돈을 계산하는 경우에, 특히 외화 등을 다뤄야 한다면 BigDecimal 클래스는 필수이다.
일반 변수를 사용하는 계산 방법과 달라서 익숙해질 때까지는 어렵다고 생각할지도 모른다. 그렇지만 엄밀한 계산을 하기 위해서는 꼭 필요하므로 익혀둘 필요가 있다.
여기에서는 Java BigDecimal에서 더하기, 빼기, 곱셈, 나눗셈 및 반올림하는 방법을 소개하겠다.
BigDecimal이란?
BigDecimal
는 임의의 길이의 10 진수의 표현과 계산을 수행할 수 있는 클래스이다.
정수부와 소수점 이하 자릿수(scale)의 조합으로 10 진수를 표현한다.
BigDecimal 사칙 연산
BigDecimal에서는 사칙 연산에 대응하는 계산 메소드가 제공된다.
메소드 | 사칙 연산 |
---|---|
add() |
더하기 |
subtract() |
빼기 |
multiply() |
곱하기 |
divide() |
나누기 |
그럼, 예제를 보도록 하자.
package com.devkuma.basic.bigdecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalArithmetic {
public static void main(String[] args) {
// BigDecimal 생성
BigDecimal one = new BigDecimal("1.00");
BigDecimal two = new BigDecimal("2.00");
BigDecimal three = new BigDecimal("3.00");
// 더하기 ( 1.0 + 2.0 )
BigDecimal add = one.add(two);
// 빼기 ( 1.0 - 2.0)
BigDecimal subtract = one.subtract(two);
// 곱하기 ( 2.0 * 3.0 )
BigDecimal multiply = two.multiply(three);
// 나누기 ( 1.0 / 3.0 소수 2자리 수를 반올림한다 )
BigDecimal divide = one.divide(three, 2, RoundingMode.HALF_UP);
System.out.println("더하기: " + add);
System.out.println("빼기 : " + subtract);
System.out.println("곱하기: " + multiply);
System.out.println("나누기: " + divide);
}
}
실행 결과:
더하기: 3.00
빼기 : -1.00
곱하기: 6.0000
나누기: 0.33
Warn
BigDecimal divide = one.divide(three);
이 경우 반올림 설정을 하지 않으면, 무한 소수가 되어
ArithmeticException
발생한다.
BigDecimal 반올림 방법
BigDecimal
에서는 반올림, 잘라내기 및 반올림을 포함하여 다음과 같은 반올림 방법을 제공한다.
계산 메소드로 반올림을 지정하는 것 외에도, 생성시에 반올림을 지정할 수 있다. RoundingMode
반올림 방법 | 설명 |
---|---|
RoundingMode.CEILING |
양수의 무한대에 가까워지도록 반올림 모드 |
RoundingMode.DOWN |
0에 가까워지도록 반올림 모드 |
RoundingMode.FLOOR |
음수의 무한대에 가까워지도록 반올림 모드 |
RoundingMode.HALF_DOWN |
반올림 |
RoundingMode.HALF_EVEN |
끝이 짝수 쪽으로 반올림 |
RoundingMode.HALF_UP |
반올림 |
RoundingMode.UNNECESSARY |
반올림 불필요 |
RoundingMode.UP |
0에서 멀어지도록 반올림 모드 |
그럼, 예제를 보도록 하자.
package com.devkuma.basic.bigdecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalRounding {
public static void main(String[] args) {
// BigDecimal 생성
BigDecimal value = new BigDecimal(123.455);
BigDecimal roundCeiling = value.setScale(2, RoundingMode.CEILING);
BigDecimal roundDown = value.setScale(2, RoundingMode.DOWN);
BigDecimal roundFloor = value.setScale(2, RoundingMode.FLOOR);
BigDecimal roundHalfDown = value.setScale(2, RoundingMode.HALF_DOWN);
BigDecimal roundHalfEven = value.setScale(2, RoundingMode.HALF_UP);
BigDecimal roundUp = value.setScale(2, RoundingMode.UP);
System.out.println("RoundingMode.CEILING: " + roundCeiling);
System.out.println("RoundingMode.DOWN :" + roundDown);
System.out.println("RoundingMode.FLOOR :" + roundFloor);
System.out.println("RoundingMode.HALF_DOWN :" + roundHalfDown);
System.out.println("RoundingMode.HALF_UP :" + roundHalfEven);
System.out.println("RoundingMode.UP :" + roundUp);
}
}
실행 결과:
RoundingMode.CEILING: 123.46
RoundingMode.DOWN :123.45
RoundingMode.FLOOR :123.45
RoundingMode.HALF_DOWN :123.45
RoundingMode.HALF_UP :123.45
RoundingMode.UP :123.46
BigDecimal 부호
BigDecimal로 수치의 부호를 받아오는 방법을 소개한다.
package com.devkuma.basic.bigdecimal;
import java.math.BigDecimal;
public class BigDecimalSignum {
public static void main(String[] args) {
int plus = new BigDecimal(100).signum(); // 1
int zero = new BigDecimal(0).signum(); // 0
int minus = new BigDecimal(-100).signum(); // -1
System.out.println(plus);
System.out.println(zero);
System.out.println(minus);
}
}
실행 결과:
1
0
-1
입력값 | signum() 반환값 |
---|---|
100(양수) | 1 |
0(영) | 0 |
-100(음수) | -1 |
그밖에 BigDecimal 메소드
그 밖에도 다음과 같은 메소드가 제공되고 있다.
메소드 | 설명 |
---|---|
intValue() |
BigDecimal 치를 int 타입으로 반환한다. |
longValue() |
BigDecimal 값을 long 타입으로 반환한다. |
floatValue() |
BigDecimal 값을 float 타입으로 반환한다. |
doubleValue() |
BigDecimal 치를 double 타입으로 반환한다. |
signum() |
BigDecimal의 부호를 반환한다. 음수: -1 , 영(0): 0 , 양수: 1 |
max(BigDecimal a) |
a 의 값과 비교하여 큰 수을 반환한다. |
min(BigDecimal a) |
a 의 값과 비교하여 작은 수을 반환한다. |
최종 수정 : 2021-12-21